알고리즘/해시

[프로그래머스] 완주하지 못한 선수 - 파이썬(python)

아뵹젼 2022. 5. 5.

 

내 풀이

def solution(participant, completion):
    hash = {} # key: 참가자 이름, value: 참가자 숫자를 담은 해시 딕셔너리

    for i in participant :
        if i in hash : # 해시테이블에 존재하는 이름이라면
            hash[i] += 1
        else :
            hash[i] = 1

    for i in completion :
        if hash[i] == 1 :
            del hash[i]
        else :
            hash[i] -= 1

    return list(hash.keys())[0]

동명이인이 존재한다는 조건에 따라 해시 테이블을 만들었다.

{key :참가자 이름 value: 완주자 수}

 

완주자 배열을 반복하면서, 해시 테이블에 있는 참가자 숫자를 1씩 뺀다.

완주자 배열을 모두 돈 후에도, 해시 테이블에 남아있는 참가자가 완주하지 못한 선수가 될 것이다.

 

 

다른 풀이 (1)

import collections


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

감탄을 금치 못한 코드...

파이썬 내장 라이브러리인 collections 의 Counter 함수를 사용한 간결한 코드이다.

 

Counter 은 다음과 같이 딕셔너리 형태로 데이터의 갯수를 세어준다.

Counter('hello world') 
# Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})

여기서 딕셔너리끼리 빼기 연산을 실행하면, value 값끼리 빼기 연산을 한 후

값이 0이라면 아예 del 을 실행해준다.

즉, 결과로 남게되는 key, value 는 완주하지 못한 자의 이름과 1의 value 값이 남게 될 것이다.

 

 

다른 풀이 (2)

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

    return answer

역시나 대단한 풀이이다.

hash() 의 정의를 정확히 알고 있어야 가능한 풀이인 것 같다.

hash() 값은 key 값이 다르다면 모두 다를 것이다. (충돌이 일어나지 않을 때)

따라서 딕셔너리에 참가자 이름의 hash() 을 key 로 주고, 참가자 이름을 value 로 설정한다.

그리고 temp 라는 값에 참가자이름의 hash() 값을 더한다.

 

그리고, 완주자 배열을 모두 돌면서 완주자이름의 hash() 값을 temp 에서 뺀다.

그럼 마지막에 남게 된 temp 값은 완주하지 못한 참가자이름의 hash() 값이 될 것이다.

그 값이 딕셔너리의 key 값으로 저장되어 있으므로 리턴해주면 된다.

댓글