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

huga·2020년 9월 2일
1

코딩테스트

목록 보기
1/8

Level1 문제

<풀이 방법 생각>

딕셔너리를 만든다. 참가자들의 이름을 key로 이용한다. value는 key의 이름을 가진 사람 수가 된다. 즉, "kate"라는 이름을 가진 사람이 3명이면 value는 3이다.
다음으로 완주자의 이름에 따라서 해당 key값의 value가 1이면 완주했으므로 딕셔너리에서 지운다. 하지만 value가 1보다 클 경우 value값을 1뺀다. (동명이인이 있을 경우 다음 동명이인의 완주 여부 확인을 위해 남겨두는 것이다.)

<Python 코드>

def solution(participant, completion):
    temp = {} # key,value를 가진 딕셔너리 이용
    #딕셔너리에 참가자 이름(key)과 해당 이름 사람수(value) 넣기 
    for i in participant :
        if i in temp : 
            temp[i]+=1
        else: 
            temp[i] =1
  
    #완주자 이름(key)의 value가 1이면 지우기, 동명이인이면 -1  
    for i in completion :
        if temp[i]==1 : 
            del temp[i]
        else : 
            temp[i] -=1

    #딕셔너리를 리스트로 바꾸고 가장 첫번째꺼 리턴(어차피 하나뿐)
    return list(temp.keys())[0]

<결과>

코딩테스트를 파이썬으로 보려고 파이썬을 공부한 지 이틀째라 파이썬 문법 에러 때문에 조금 우왕좌왕했다. 하지만 쓰다 보면 익숙해질 것이다.

<다른 사람들의 풀이 구경>

(1) collections 모듈을 이용한 방법

import collections

def solution(participant, completion):
    answer = collections.Counter(participant) - collections.Counter(completion)
    return list(answer.keys())[0]

Collections 모듈를 추가하여 Counter라는 함수를 이용해서 저절로 key(이름)와 value(동명이인)을 만들어주었다. 파이썬에 이런 라이브러리가 있다니. 정말 코드가 짧아서 감탄했다. 그리고 각각 count한 것을 빼줄 수도 있는데 value끼리 뺀 것이 0이면 아예 없애버린다. answer를 print해보니 Counter({'mislav': 1}) 라는 결과가 뜬 것으로 유추한 내용이다.

(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

역시 딕셔너리를 이용한 것은 마찬가지인데, key값을 이름이 아닌 이름의 해시값을 이용한 것이 독특했다. 우선 참가자들의 이름의 hash값을 key로, 참가자의 이름은 value로 하는 딕셔녀리를 만들면서 temp라는 변수에 hash값들을 더해준다. 그리고 완주자들의 이름을 for문을 돌리면서 완주자들의 이름의 해시값들을 temp에서 빼준다. 이렇게 되면 temp는 오직 하나의 이름에 대한 해시값을 갖게 된다. 앞서 만든 딕셔너리의 key는 이름의 해시값이므로 temp(비완주자 이름의 해시값)를 이용하여 비완주자를 찾을 수 있다. 완주하지 못한 선수가 한명이라 가능한 방법같지만 hash함수를 잘 사용한게 신기했다.

0개의 댓글