수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
제한사항
def solution(participant, completion):
answer = ''
#https://vision-ai.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%A6%AC%EC%8A%A4%ED%8A%B8-count-%EC%99%80-len
#https://security-nanglam.tistory.com/427
dic = {p:participant.count(p) for p in participant} #참가자 이름인 사람이 몇 명 있는지 세기
for c in completion:
dic[c]-=1
if dic[c] == 0:
del dic[c]
# print(dic.keys())
return list(dic)[0]
# for d, i in dic.items(): #키, 값 모두 https://dojang.io/mod/page/view.php?id=2308
# if i>0:
# return d
dic = {p:participant.count(p) for p in participant} #참가자 이름인 사람이 몇 명 있는지 세기
: 참가자 이름을 키값으로, 그 이름의 인원수를 밸류로 받은 딕셔너리 생성함.
for c in completion:
dic[c]-=1
if dic[c] == 0:
del dic[c]
: 완주자 이름 하나당 딕셔너리에서 해당 이름 가진사람의 인원수 밸류 감소
: 인원수가 0이되면 딕셔너리에서 제거
return list(dic)[0]
: 마지막 남은 딕셔너리의 리스트를 반환
실패!
하는 수 없이 구글링을 하기로 함.
구글링으로 찾아낸 결과에 의하면
- 참가자와 완주자를 정렬하고,
- 참가자와 완주자를 zip으로 묶음
- 한 쌍 안에서 이름이 다르면 반환, 모두 같을 경우에는 참가자의 마지막 사람 반환
근데 이건 해시가 아닌데?ㅠㅠㅠ 난 해시로 풀고 싶다.
딕셔너리로 해결한 다른 분의 코드를 봤는데, 내 알고리즘이랑 크게 다르지 않다.
그러나 조금 다른 부분이 있었는데, 그 분은 밸류값(인원수)을 반복문으로 넣었다. 나는 count로 해결했는데. (dic = {p:participant.count(p) for p in participant} #참가자 이름인 사람이 몇 명 있는지 세기
)
따라서 이 부분을 고쳐보기로 했다.
# 참가자 이름인 사람이 몇 명 있는지 세기
# 이름:인원수
for p in participant:
if p in dic:
dic[p] += 1
else:
dic[p] = 1
오예
사용 공간 측면에서 효율성을 본 것 같다. (아닐수도)
구글링하면 이런 저런 풀이법이 많이 나오지만 문제 유형은 해시이므로 해시답게 접근하는 편이 좋다.
def solution(participant, completion):
dic = {} # 참가자와 인원수 딕셔너리
# 참가자 이름인 사람이 몇 명 있는지 세기
# 이름:인원수
for p in participant:
if p in dic:
dic[p] += 1
else:
dic[p] = 1
for c in completion:
dic[c]-=1
if dic[c] == 0:
del dic[c]
return list(dic)[0]
list.count(값)
https://vision-ai.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%A6%AC%EC%8A%A4%ED%8A%B8-count-%EC%99%80-len
dict = {l:0 for l in list}
https://security-nanglam.tistory.com/427