본문 바로가기

Python/코딩 테스트 해설집

프로그래머스 - 해쉬 - 완주하지 못 한 선수

반응형

1. 문제의 출처

 

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

 

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

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

programmers.co.kr

 

2. 문제의 설명

우선 두개의 리스트가 주어집니다. 

 

첫 번째는 참여자 리스트가 있고, 두 번째는 완주자 리스트가 있습니다. 두 리스트 간 길이가 무조건 1이 차이가 난다고 할 때, 누가 과연 완주를 못 했는지 파악하는 문제입니다. 

 

문제의 함정은 동명이인이 있고, 이중 한 명이 완주하지 못 했을 경우 어떻게 이들을 걸러낼 것인가 입니다. 

 

 

 

3. 나의 해답

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def solution(participant, completion):
    answer = ''    
    
    all_list = participant + completion
    answer_dict = dict()
    
    for member in all_list:
        try:
            answer_dict[member] += 1
        except:
            answer_dict[member] = 1
    
    for k, v in answer_dict.items():
        if v % 2 == 1:
            answer = k
 
    
    return answer
cs

 

저는 데이터 구조 중 Dictionary의 특성을 활용하고자 했습니다. Dictionary는 Key와 Value 값을 지니게 되고, Key 간에는 중복과 순서가 없다는 특징이 있죠. 

 

이 문제가 Hash로 분류되어 있는 것을 고려할 때 바로 이 Key와 Value의 특성을 활용해야 겠다는 힌트를 얻었습니다. 

또한 문제의 조건 상 만약 완주를 한 사람들은 Participants와 Completion 리스트에 짝수번 등장하게 되어 있습니다. 만약 홀수번 등장한다면, Completion에 나오지 않기 때문에 1번 혹은 홀수번 등장하게 되겠죠.

 

그래서 이 코드를 구현할 때는 실력을 높이기 위해서 Counter 패키지를 쓰지 않고 직접해봤어요. 

    for member in all_list:

        try:

            answer_dict[member] += 1

 

"Dictionary에서 자신을 Key값으로 두었을 때 1을 더해라."

 

        except:

            answer_dict[member] = 1

 

"만약 자기 자신이 없다면, 그냥 1로 두어라"

 

그러면 1번만 등장하는 경우는 1이 될 것이고, 홀수번 등장하는 경우는 3, 5, 7 이런 식으로 데이터가 구성이 되겠죠.

 

이 다음 Dictionary에서 items()메소드를 구현하여, value 중 홀수 값을 찾아 Key값을 Return하면 정답이 됩니다.

 

정답 인증

 

하지만 허무한 것은 Counter 패키지 쓰면 몇줄이면 끝납니다 ^^

1
2
3
4
5
6
7
8
9
10
11
12
13
def solution(participant, completion):
    from collections import Counter
    answer = ''    
    
    answer_dict = Counter(participant + completion)
    
    
    for k, v in answer_dict.items():
        if v % 2 == 1:
            answer = k
 
 
    return answer
cs

 

반응형