Algorithm/Programmers

[programmers/python] 무작위로 k개의 수 뽑기 풀이

쉬지마 이굥진 2024. 5. 14. 11:12

https://school.programmers.co.kr/learn/courses/30/lessons/181858

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제


첫 번째 풀이 (❌)

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의 성질을 확실히 정리했다. 다음엔 이런 걸로 실수하는 일 없게 하자!

 

[Python] 리스트 append 와 extend의 차이

다들 알다시피 append와 extend는 리스트에 요소를 추가하는 메서드다. 알고리즘 문제를 풀다가 extend를 썼어야 할 때에 append를 써서 틀려 이번 기회에 뭐가 다른지 차이점을 확실히 짚고 넘어가고

developer-jinnie.tistory.com