카이로스의 시간

[해시] 완주하지 못한 선수 본문

Algorithm

[해시] 완주하지 못한 선수

차녕 2022. 3. 6. 11:52

문제링크: https://programmers.co.kr/learn/courses/30/lessons/42576

 

사용 알고리즘: 해시

 

풀이:

python dictionary를 이용해서 해시테이블에 데이터를 넣고, 비교하는 방식으로 구현했습니다.

participant, completion 이라는 참가자, 완주자 list를 dictionary로 정리했으며, 이때는 동명이인을 구분하기 위해서

value 값을 하나씩 높였습니다.

 

예를 들어서,

participant = ["mislav", "stanko", "mislav", "ana","ana","ana"]

라는 참가자 list가 주어지면 dic_participant에 {'mislav': 1, 'stanko': 0, 'ana': 2} 와 같이

{참가자이름:동명이인숫자}로 정의했습니다.
동일하게 completion도 정리하고 반복문으로 key:value를 비교했습니다.

 
def solution(participant, completion):
    answer = ''
    dic_participant = {}
    dic_completion = {}

    for name in participant:
        if name in dic_participant.keys():
            dic_participant[name] = dic_participant[name] + 1
        else:
            dic_participant[name] = 0
        
    for name in completion:
        if name in dic_completion.keys():
            dic_completion[name] = dic_completion[name] + 1
        else:
            dic_completion[name] = 0
            
    for name in dic_participant.keys():
        if name in dic_completion.keys():
            if dic_completion[name] == dic_participant[name]:
                pass
            else:
                answer = name
    return answer
 
 
채점결과는 무난히 통과했습니다.

그런데 다른사람들 풀이를 보니 엄청 간단하게 구현했더군요.
다른사람들 풀이에서는 collections를 import해서 Counter 클래스로 아래처럼 구현했습니다.
 
import collections

def solution2(participant, completion):
    answer = collections.Counter(participant) - collections.Counter(completion)
    return list(answer.keys())[0]
 
 
Counter 클래스는 string에서 문자 또는 list에서 string의 개수를 쉽게 dictionary로 정리할 수 있습니다.
 
string='aaabbccabc'
print (collections.Counter(string))
 
Counter({'a': 4, 'b': 3, 'c': 3})
 
list가 인풋인 경우, 중복되는 string의 개수를 dictionary로 정리합니다.
 
participant = ["mislav", "stanko", "mislav", "ana"]
print (collections.Counter(participant))
 
Counter({'mislav': 2, 'stanko': 1, 'ana': 1})
 
 
최종적으로 Counter dictionary끼리 빼는 동작으로 value차이가 1인(count가 1개 차이인)
 
key, value쌍을 추출할 수 있습니다.
 
answer = collections.Counter(participant) - collections.Counter(completion)
print (answer)
 

 

'Algorithm' 카테고리의 다른 글

N으로 표현  (0) 2019.12.05