Algorithm/Programmers

[Python] 완주하지 못한 선수

느낌표 공장장 2021. 4. 12. 23:59
def solution(participant, completion):
    participant.sort()
    completion.sort()
    
    for i in range(len(completion)) :
        if participant[i] != completion[i] :
            return participant[i]
    
    return participant[-1]

 


1. 먼저 participant, completion을 정렬한뒤,

2. for 문으로 두 리스트의 인덱스 0부터 시작하여 값들을 비교해 나간다.

3. if문을 활용해 두 값이 같지 않으면 participant[i]를 str형태로 반환해준다.

4. 위의 if문에 걸리지 않는다면,  완주하지 못한 선수가 participant 리스트의 마지막에 있는 경우이므로 이를 반환해준다.


다른 풀이 1) zip 함수 이용

def solution(participant, completion):
    participant.sort()
    completion.sort()
    
    for p, c in zip(participant, completion):
        if p != c:
            return p
            
    return participant[-1]

 

 

다른 풀이 2) hash 이용

def solution(participant, completion):
    temp = 0
    dic = {}
    
    for part in participant:
        dic[hash(part)] = part
        temp += hash(part)
        
    for com in completion:
        temp -= hash(com)

    return dic[temp]

효율 테스트 1등

1. 반복문과 hash 함수를 이용하여 participant 리스트의 이름을 hash함수로 부여받은 임의의 수와 함께 dic에 차례로 넣어준다. 또한 hash함수로 받은 임의의 수들을 temp에 저장해준다.

2. 두번째 반복문을 통해 completion에서 값들을 불러온다. 이 값들을 hash함수로 적용해주어 temp에서 빼준다.

3. 남은 temp의 값이 dic의 키가 된다.

 

다른 풀이 3) collections.Counter 이용

import collections

def solution(participant, completion):
    answer = collections.Counter(participant) - collections.Counter(completion)
    return list(answer.keys())[0]

1. collections.counter을 이용하여 participant와 completion의 각 요소(각 이름)의 개수들을 구한다.

2. participant에서 completion을 빼주면 완주하지 못한 사람의 이름만 남는다.

3. answer에서 key값을 뽑아내고, 리스트로 만들어 준 뒤, 값을 도출해준다.

이해를 위해 각 코드의 줄 마다 값들을 도출해보았다.