처음 시도한 코드
def solution(participant, completion):
for i in completion:
if i in participant:
participant.remove(i)
return ''.join(participant)
어렵지 않은 문제이기 때문에 쉽게 코드를 작성할 수 있었다.
하지만 정확성 테스트는 모두 통과하지만 효율성 테스트는 시간 초과로 실패하였다.
내가 작성한 코드에서 시간을 많이 소요되는 부분을 생각해 보니 for문과 remove임을 알 수 있었다.
completion이 길어지면 길어질수록 for문의 시간도 증가하고, participant가 길어질수록 remove에도 시간이 오래 걸린다.
정답 코드
from collections import Counter
def solution(participant, completion):
p = Counter(participant)
c = Counter(completion)
fail = list(p-c)
return fail[0]
그래서 요소 하나를 두 리스트에 공통으로 존재하는지 비교하는 것보단 Counter를 사용하는 방식을 택하였다.
Counter를 사용하여 participant, completion의 모든 요소들의 개수를 센 뒤, 차를 구하면 해당 값이 완주하지 못한 선수가 된다.
Counter끼리 마이너스(-) 연산이 가능하기 때문에 쉽게 완주하지 못한 선수를 찾을 수 있다.
p-c를 list로 만들어주면 위 사진처럼 ['leo']가 된다. 딕셔너리를 list로 만들어주면 key값들로만 이루어지기 때문에 구하고자 하는 선수의 이름만 쉽게 리스트로 만들 수 있다.
문제에서 단 한 명만 제외하고 모든 선수가 완주를 했다고 알려주었으므로, 완주하지 못한 선수는 단 한 명이다.
따라서 0번째 요소만 리턴해주면 된다.
반응형