해시 Hash 함수
- Hash는 전화번호부와 같다.
- 대부분 그 Key가 String이다.
- get / put / getOrDefault
문제 설명
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
제한 사항
- 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
- completion의 길이는 participant의 길이보다 1 작습니다.
- 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
- 참가자 중에는 동명이인이 있을 수 있습니다.
입출력 예
participant | completion | return |
---|---|---|
[“leo”, “kiki”, “eden”] | [“eden”, “kiki”] | “leo” |
[“marina”, “josipa”, “nikola”, “vinko”, “filipa”] | [“josipa”, “filipa”, “marina”, “nikola”] | “vinko” |
[“mislav”, “stanko”, “mislav”, “ana”] | [“stanko”, “ana”, “mislav”] | “mislav” |
한 선수만 완주하지 못함 -> 마라톤 선수 1명 이상 참여 ->
참가 선수 이름 배열 participant / 완주 선수 이름 배열 completion
-> 완주하지 못한 선수의 이름 return
Hash 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def solution(participant, completion):
hashDict = {}
sumHash = 0
# 1. participant list의 hash를 구하고, hash 값을 더한다.
for part in participant:
hashDict[hash(part)] = part
sumHash += hash(part)
# 2. completion list의 hash를 빼준다.
for comp in completion:
sumHash -= hash(comp)
# 3. 남은 값이 완주하지 못한 선수의 hash 값이 된다.
return hashDict[sumHash]
Counter 풀이
1
2
3
4
from collections import Counter
def solution(participant, completion):
answer = Counter(participant) - Counter(completion)
return list(answer.keys())[0]
Counter 객체
Counter는 편리하고 빠르게 개수를 세도록 지원하는 계수기 도구가 제공된다.
- collections — 컨테이너 데이터형
- collections 모듈은 파이썬의 범용 내장 컨테이너 dict, list, set 및 tuple에 대한 대안을 제공하는 특수 컨테이너 데이터형을 구현한다.
from collections import Counter
1
2
3
4
5
# Tally occurrences of words in a list
cnt = Counter()
for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
cnt[word] += 1
cnt # Counter({'blue': 3, 'red': 2, 'green': 1})