[프로그래머스_해시_Lv1] 완주하지 못한 선수

Lee, Chankyu·2022년 1월 5일
0
post-thumbnail

완주하지 못한 선수

문제 링크

나의 풀이

🙅‍♂️ 잘못된 풀이

def solution(participant, completion):
    marathon_dic = {}
    for i in participant:
        marathon_dic[i] = "fail"
    for j in completion:
        marathon_dic[j] = "success"
    for key, value in marathon_dic.items():
        if value == "fail":
            return key  # 동명이인이 없을 경우엔 가능한 로직이지만, 동명이인을 판별하지 못한다. 
  • participant(전체 참가자) 요소들을 빈 딕셔너리(marathon_dic)에 key 값으로 넣고 value로 "fail"을 넣어준다.
  • completion(완주자) 요소들(key)의 value로 "success"를 넣어주면 value로 "fail"이 남은 key 값이 완주 실패자 라고 생각하여 코드를 작성하였다.
  • 그러나 동명이인이 있으면 이를 판별할 수 없는 코드이다. 동명이인이 있는 경우를 생각하지 못하였고, 코드를 아래와 같이 전면 수정하였다.

🙆‍♂️ 정답코드

def solution(participant, completion):
    marathon_dic = dict()
    hashValue = 0
    
    for player in participant:
        marathon_dic[hash(player)] = player
        hashValue += hash(player)

    for finisher in completion:
        hashValue -= hash(finisher)
        
    return marathon_dic[hashValue]
  • 첫 번째 코드에서는 marathon_dic의 key, value 값으로 "참가자 이름", "success or fail"을 넣었으나, 이번엔 key, value 값으로 참가자 이름의 해시 값과 참가자 이름을 넣었다.
  • hashValue 변수에 0을 넣고 이후 참가자들의 해시 값을 계속 더하였다.
  • completion(완주자) 리스트를 for 반복문을 돌리고 이들의 해시값을 hashValue 에서 뺐다.
  • 문제에서 participant와 completion 리스트의 길이 차이 1 이라는 조건을 주었기 때문에 hashValue에 남은 값으로 marathon_dic 에서 value 값을 리턴하면 정답이 된다.

다른 사람의 풀이

import collections

def solution(participant, completion):
    answer = collections.Counter(participant) - collections.Counter(completion)
    return list(answer.keys())[0]
  • colletions의 모듈의 Counter 객체를 사용하여 뺄셈을 구현한 것이라고 볼 수 있다.
  • Counter 객체에 대해 처음 알았고 알아두면 유용하게 쓰일 수 있는 기능이겠지만 이 풀이법이 문제의 의도대로 풀이한 건 아닌거 같다.
profile
Backend Developer - "Growth itself contains the germ of happiness"

0개의 댓글