내 풀이
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 값으로 저장되어 있으므로 리턴해주면 된다.
'알고리즘 > 해시' 카테고리의 다른 글
[프로그래머스] 폰켓몬 - 파이썬(python) (0) | 2022.09.01 |
---|---|
[프로그래머스] 베스트앨범 - 파이썬(python) (0) | 2022.05.06 |
[프로그래머스] 위장 - 파이썬(python) (0) | 2022.05.05 |
[프로그래머스] 전화번호 목록 - 파이썬(python) (0) | 2022.05.05 |
댓글