본문 바로가기
개발/프로그래머스

프로그래머스 해시 level1 완주하지 못한 선수- collections 모듈의 Counter 함수

by 자유로운 코끼리 2020. 9. 2.
728x90

내가 한 풀이

def solution(participant, completion):
    dict={}
    for p in participant: 
        if p in dict:
            dict[p]+=1
        else:
            dict[p]=1
    for p in completion:
        if dict[p]==1:
            del(dict[p])
        else:
            dict[p]-=1       
    answer=list(dict.keys())[0] 
    return answer

1. 딕셔너리에 참가자 이름(p)을 key값으로 하여 그 수를 value 값으로 둔다.

2. 완주자 배열을 for문을 통해 돌며,

value 값이 1일 경우 지우고

그 이상의 값일 경우 하나씩 뺀다.

collection 모듈의 counter함수를 이용한 풀이

import collections

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

counter 함수는 항목의 개수를 세어주는 함수이다.

아래 예시 참고.

from collections import Counter

my_list = ['hi', 'eun', 'hi']
print(Counter(my_list)) # Counter({'hi': 2, 'eun': 1})

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

해시 함수를 이용한 풀이(근본적인 문제를 고려하면 오답)

def solution(participant, completion):
    answer = ''
    temp = 0
    dic = {}
    for part in participant:
        dic[hash(part)] = part #index값을 key로, part를 value값으로-
        temp += int(hash(part))
    for com in completion:
        temp -= hash(com)
    answer = dic[temp]

    return answer

 

1. part에 대한 index값을 key로, part를 value로 두는 딕셔너리를 만듦.

2. 각 index값을 더함.

3. 완주자의 index값을 뺌.

4. 남은 index 값이 가르키는 것이 답

다만 여기서 해시 충돌이 일어나게 됬을 때를 고려하면 사용할 수 없는 풀이다. 

하지만 처음 hash에 대한 개념이 없을 때 이 문제를 통해 개념을 잡을 수 있었음으로 적어둔다.

기타 답

def solution(participant, completion):
    participant.sort()
    completion.sort()
    for i in range(len(completion)):
        if participant[i] != completion[i]:
            return participant[i]
    return participant[len(participant)-1]

1. 각 참가자와 완주자를 정렬시킴

2. 비교하다 참가자와 완주자가 다를 경우-> 즉,  완주하지 못한 사람을 잡아내어 return

3. 다 돌았는데도 없었다면, 마지막 사람이 완주를 못한 것일 것임으로 그 사람을 return

 

 

 

 

 

 

댓글