수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
def solution(participant, completion):
for i in completion:
participant.remove(i)
return participant[0]
participant(참가자) 중 complement(완주자)에 없는 사람을 찾는 문제이므로 처음엔 단순하게 참가자 리스트에서 완주자 리스트에 사람을 찾아서 없애면 되지 않을까? 하는 생각으로 작성했던 코드다.
테스트를 돌려본 결과, 정확성은 만점이지만 효율성에서 0점을 받았다.
def solution(participant, completion):
a = set(participant) ^ set(completion)
return list(a)[0]
그 다음으로 작성한 코드이다. xor 연산을 사용하면 더 빠르게 할 수 있다는 생각으로 다음 코드를 짜게 되었다. 하지만 테스트를 돌려보니 한 가지 간과한 사실이 있었다.
참가자 중에는 동명이인이 있을 수 있습니다.
set로 만들어서 xor 연산을 실행하므로 예를 들어 다음 케이스의 경우 올바른 답을 내리지 못한다.
["mislav", "stanko", "mislav", "ana"], ["stanko", "ana", "mislav"]
리스트에서는 set처럼 xor연산을 지원해주지 않아 어떻게 하면 리스트를 xor연산할 수 있을까 고민하던 도중 결국 포기하고 다른 방법을 궁리하게 되었다.
import collections
def solution(participant, completion):
a = collections.Counter(participant)
b = collections.Counter(completion)
return list(a - b)[0]
최종적으로 작성한 코드이다. collections 모듈의 Counter 함수를 통해 { key : 참가자, value : 사람 수 } 형태의 딕셔너리를 만들었다. 또한 collections.Counter는 뺄셈 연산을 지원하기 때문에 둘을 빼줌으로써 문제를 해결했다.