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
'개발 > 프로그래머스' 카테고리의 다른 글
프로그래머스 해시 level2 전회번호 목록 (0) | 2020.09.02 |
---|---|
[파이썬]프로그래머스 level1 해시, 완주하지못한 선수 (0) | 2020.09.01 |
프로그래머스 level1 나누어 떨어지는 숫자 배열 (0) | 2020.08.31 |
댓글