https://school.programmers.co.kr/learn/courses/30/lessons/181858
문제
첫 번째 풀이 (❌)
def solution(arr, k):
answer = list(set(arr))[:k]
length = len(answer)
if length < k:
answer.append([-1] * (k - length))
return answer
로직은 잘 만들었는데, 문제 마지막의 예외처리를 잘못했음을 알 수 있었다. 리스트를 확장시켜야 하는데 리스트 요소 추가 메서드를 헷갈려서 리스트 안에 리스트를 또 만들어버렸다 ㅎ([0, 1, [-1, -1]])
두 번째 풀이 (❌)
def solution(arr, k):
answer = list(set(arr))[:k]
length = len(answer)
if length < k:
answer.extend([-1] * (k - length))
return answer
append 👉 extend로 변경해서 부족한 원소의 자리를 모두 -1로 확장해주도록 했다. ([0, 1, -1, -1])
이번에는 100% 맞았다고 생각했는데, 테스트케이스들을 다 통과해서 제출을 누르니 ..
?????????? 결과에서 싹 다 실패가 떠버린다. 이유를 찬찬히 고민해보니 answer = list(set(arr))[:k] 이 부분에서, set은 중복을 제거해주지만 순서를 보장하지 않기 때문에 싹 다 실패가 뜨는 것 같다고 추측했다.
세 번째 풀이 (⭕)
def solution(arr, k):
answer = []
for num in arr:
if num not in answer:
answer.append(num)
if len(answer) == k:
break
if len(answer) < k:
answer.extend([-1] * (k - len(answer)))
return answer
그래서 set을 빼고 for문으로 순회하면서 중복이 없으면 리스트에 넣는 식으로 로직을 수정했다. 🥲
이렇게 제출하니 드디어 성공!
정리
이번 기회로 append와 extend의 차이와 set의 성질을 확실히 정리했다. 다음엔 이런 걸로 실수하는 일 없게 하자!
'Algorithm > Programmers' 카테고리의 다른 글
[programmers] 피자 나눠 먹기 (2) 파이썬 풀이 (1) | 2024.06.13 |
---|---|
[programmers lv1.python] 기사단원의 무기 풀이 (0) | 2024.05.16 |
[programmers lv2.python] 롤케이크 자르기 풀이 (2) | 2024.04.30 |
[programmers lv2.python] 이진 변환 반복하기 풀이 (리팩토링 다..수..) (2) | 2024.04.29 |
[programmers lv3.python] 베스트 앨범 풀이 (0) | 2024.03.08 |