본문 바로가기
Algorithms & CS

[Python] 프로그래머스 - 완주하지 못한 선수

by 고막고막 2021. 8. 10.

나의 풀이

def solution(participant, completion):
    for i in participant:
        for i in completion:
            participant.remove(i)
    return participant[0]
cs

예전에 자바 이중루프로 풀어보았던 문제를 유사한 방식으로 파이썬으로 풀어보았다. 테스트 케이스는 아주 간단하게 통과했으나, 또 다시 정확도 검사에서 실패..! 그사이에 프로그래머스 정확도 검사 케이스가 추가되었던 걸까...

 

다른 사람의 풀이

def solution(participant, completion):
    temp = 0
    dic = {}
    for part in participant:
        dic[hash(part)] = part
        temp += int(hash(part))
    # dic : {-1032820062074603112: 'mislav', -5502838157513089391: 'stanko', 5975240315166734488: 'ana'}
    # temp : -1593237966495561127
    for com in completion:
        temp -= hash(com)
    return dic[temp]
cs

문제의 의도가 hash를 사용하라는 것이었기 때문에 그 의도대로 딕셔너리 자료형을 사용한 방법이다. 딕셔너리의 key에는 참가자 문자열이 저장되는 실제 hash값을 넣고, value에는 문자열을 담는다. 같은 문자는 동일한 hash 주소를 가리킴 → 중복된 문자는 동일한 key값을 가짐 → 딕셔너리에서 key값은 고유함 → 결론적으로 중복된 선수는 딕셔너리에 담기지 않음

그리고 이 딕셔너리와는 상관없이 각 원소들의 hash값을 누산하는 변수를 하나 만든다. 그리고 그 변수에서 완주자 리스트에 존재하는 원소들의 hash값을 모두 빼면 완주하지 못한 선수의 이름이 저장된 hash값만 남게 되고, 딕셔너리에서 해당 hash값을 찾아 value를 리턴하면 성공이다. hash값 자체로 연산을 한다는 접근은 전혀 생각해보지 못했기 때문에 신선하게 느껴지는 풀이였다.