본문 바로가기

카테고리 없음

[프로그래머스 문제풀이] 완주하지 못한 선수 (python)

반응형
프로그래머스의 코딩테스트 고득점 Kit에 있는 문제 중, 해시파트에 있는 첫번째 문제다. 
 
 

완주하지 못한 선수 문제 링크 

 
 

 

 

나의 풀이 과정 (오답노트 형식으로 되어있습니다)

 
첫번째 방법 (실패)
def solution(participant, completion):
    for man in completion:
        participant.remove(man)
    answer = participant[0]
    return answer

 

첫번째로 시도한 방법은 완주한 사람들(completion)의 원소를 읽어와 참여자(participant)에서 하나씩 제거하는 무식한 방법으로 코딩했다. 당연히 정확성 테스트는 통과했지만, 효율성 테스트는 탈락.
 
 
 
두번째 방법(실패)
  for man in participant:
        if man not in completion:
            return man
        completion.remove(man)

 

두번째로는 참여자들을 하나씩 보면서 완주자에 없으면 리턴하도록 코드를 짰다. 첫번째 방법보다 성능은 좋아졌지만 역시나 실패.
 
 
마지막 방법(성공)
 def solution(participant, completion):
    participant.sort()
    completion.sort()
    
    for i in range(len(participant)):
        if participant[i] != completion[i]:
            return participant[i];
    
마지막 방법으로 생각한 것은 리스트를 정렬하는 것이었다. 일단 리스트를 정렬한후 하나씩 비교해서 다른게 있다면 리턴해주면 될것 같았다. 이렇게 되면 매 루프마다 remove를 하는데  시간을 줄일 수 있다.
 
참여자 : ['김갑환', '김철수', '나오정', '황찬희']
완주자 : ['김갑환', '김철수', '황찬희']
 
즉 2번 인덱스에서 서로 값이 다를 것이므로 그때의 참여자 이름을 리턴한다면, 해당 선수가 완주 명단에 없다는 것을 알 수 있을 것이다.
 
 
다행히 두개의 테스트를 통과헀다. 다른 사람들의 풀이를 보니깐, 
collection의 Counter함수를 사용해 객체의 수를 센 후 빼는 방법으로 해결한 방법도 있는데, 그 방법이 가장 깔끔해보였다. 
 
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
반응형