수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
| participant | completion | return |
|---|---|---|
| ["leo", "kiki", "eden"] | ["eden", "kiki"] | "leo" |
| ["marina", "josipa", "nikola", "vinko", "filipa"] | ["josipa", "filipa", "marina", "nikola"] | "vinko" |
| ["mislav", "stanko", "mislav", "ana"] | ["stanko", "ana", "mislav"] | "mislav" |
def solution(participant, completion):
complet_table = [hash(complete_player) for complete_player in sorted(completion)]
participant = sorted(participant)
for entry, complete in zip(participant, complet_table):
if not hash(entry) == complete:
return entry
return participant[-1]
participant와 completion을 같이 가져와야 한다.
participant와 completion의 정보를 토대로 둘을 비교해 participant쪽에만 있는 한 사람이 완주하지 못한 선수라는 것을 찾아야 한다.
문자열을 정렬한다면?
두 인자 모두 리스트 내 요소는 문자열로 이루어져 있다. 그렇다면 정렬을 한다면 비교하기가 더 수월하지 않을까?
입출력 예 1번을 예로 들자면, 두 이자를 정렬했을 때 다음과 같이 된다.
participant : ["eden", "kiki", "leo"]
completion : ["eden", "kiki"]
고로, leo가 완주하지 못한 선수라는 것을 쉽게 알 수 있다.
정렬했을 때의 여러 경우 생각해보기
participant와 completion 비교 중 문자열이 다른 경우
participant : ["eden", "kiki", "leo"]
completion : ["eden", "leo"]
위 경우라면, kiki가 완주하지 못한 선수이므로, kiki를 반환하면 된다.
participant와 completion 비교 결과 전부 일치하는 경우
participant : ["eden", "kiki", "leo"]
completion : ["eden", "kiki"]
위 경우라면, leo가 완주하지 못한 선수이므로 participant의 가장 마지막을 반환하면 된다.
정렬 알고리즘을 이용하면, 동명이인의 경우도 처리할 수 있기 때문에 효율적이다.
import collections
def solution(participant, completion):
answer = collections.Counter(participant) - collections.Counter(completion)
return list(answer.keys())[0]
Counter 인스턴스 간에는 서로 사칙연산이 가능하다. 이렇게 되면, 결국 completion에 들어있지 않은 한 선수만이 남게 된다. Counter 인스턴스는 딕셔너리이므로 필요한 정보인 key 값을 가져와 반환하면 된다.