1. 문제의 출처
programmers.co.kr/learn/courses/30/lessons/42576
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 |
'Python > 코딩 테스트 해설집' 카테고리의 다른 글
프로그래머스 - 스택/큐 - 프린터[파이썬] (0) | 2021.02.02 |
---|---|
프로그래머스 - 해쉬 - 전화번호 목록 (0) | 2021.01.17 |
백준 - 1920번 - 수 찾기 (0) | 2021.01.11 |
백준 - 10930번 - SHA 256 (0) | 2021.01.11 |
프로그래머스 - 정렬 - H-index (0) | 2021.01.11 |