본문 바로가기

ALGORITHM/Algorithm 문제풀이

[문제풀이] Hash - 완주하지 못한 선수

1차 시도


def solution(participant, completion):
    part_dic = {person: 0 for person in participant}
    for person in completion:
        part_dic[person] = 1
    for key, value in part_dic.items():
        if value == 0:
            return key

첫번째 시도에서는 동명이인을 해결하지 못하였다. dictionary는 동일한 key를 가지는 형태를 허용하지 않기 때문이다. 어떻게 해결할까고민을 하다가 value에 사람의 인원수를 넣으면 어떨까 싶었다. 그래서 "사람:인원" 의 key-value형태를 구성하고, 반복문으로 completion 리스트를 돌면서 인원수를 감소시키고 인원수가 음수가 되면 dictionary에서 제거한다. 어차피 문제를 읽어보면 무조건 한명은 낙오가 되는 구조기 때문에 dictionary에는 한명만 남겨져 있을 것이므로, 그냥 dictionary에서 key를 추출하고 리스트로 바꾸서 0번째 요소만 반환하는 구조로 설계해보았다.

 

 

 

2차 시도


def solution(participant, completion):
    part_dic = {}
    for person in participant:
        if person not in part_dic:
            part_dic[person] = 0
        else:
            part_dic[person] += 1
    for person in completion:
        part_dic[person] -= 1
        if part_dic[person] == -1:
            del part_dic[person]
    return list(part_dic.keys())[0]

모든 테스트 케이스를 통과하였다. 이번에 프로그래머스 처음 써보는데, 문제를 다 풀고 나니까 다른 사람들이 어떻게 풀었는지 볼 수있다. 문제를 collections.Counter로 푼 사람이 있었는데 정말 짧고 간결하였다. 역시 파이썬으로 코드짜는 것은 예술이구나를 느꼈다. 평소에 맨날 torch, torchaudio, torchvision 이런 라이브러리만 보다가 collections 보니까 신기방기. 

 

 

의문점


프로그래머스에서는 이 문제를 해시 문제로 분류하였는데, 그냥 리스트에서 연산하면 안될까? 라는 생각이 든다. 아마 속도가 빠르다는 장점이 있어서 그런거 같은데... 이거는 직접 테스트 케이스를 거쳐봐야 알것 같다.

 

 

Reference


https://programmers.co.kr/learn/courses/30/lessons/42576

 

코딩테스트 연습 - 완주하지 못한 선수

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수

programmers.co.kr