-
[코딩테스트 고득점 Kit / Level1 👶🏻 / 해시] 완주하지 못한 선수(python)🧠𝗔𝗹𝗴𝗼𝗿𝗶𝘁𝗵𝗺/💙프로그래머스 2021. 6. 25. 17:48
1. 문제 설명
문제: https://programmers.co.kr/learn/courses/30/lessons/42576
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
2. 제한 사항
- 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
- completion의 길이는 participant의 길이보다 1 작습니다.
- 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
- 참가자 중에는 동명이인이 있을 수 있습니다.
3. 입출력 예
예제 #1
"leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.예제 #2
"vinko"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.예제 #3
"mislav"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.4. 나의 풀이
해시(딕셔너리)로 참가자 이름을 Key로, 이름 개수(count)를 value로 한다.
participant의 value와 completion의 value가 다르면 완주하지 못한 선수, answer다!
def solution(participant, completion): answer = '' part_dict = {} comp_dict = {} for p in participant: if p in part_dict: #이미 기입한 거면 +1 part_dict[p] += 1 else: #새로 기입하는 거면 part_dict[p] = 1 for p in participant: #p에 있는 것 comp_dict에 초기화 if p not in comp_dict: comp_dict[p] = 0 for c in completion: #completion에 있는 것 count 세기 comp_dict[c] += 1 for p in participant: if part_dict[p] != comp_dict[p]: answer = p return answer
5. 다른 사람의 풀이
import collections def solution(participant, completion): answer = collections.Counter(participant) - collections.Counter(completion) return list(answer.keys())[0]
위 코드를 공부해보겠다. 굉장히 간단해서 놀라웠다..!
먼저 데이터의 개수를 셀 때 다음 코드와 같이 파이썬의 내장 자료구조인 dictionary가 많이 쓰인다.
def countLetters(word): counter = {} for letter in word: if letter not in counter: counter[letter] = 0 counter[letter] += 1 return counter counterLetters('hello world') # {'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1}
그런데, 여기서 collections.Counter를 이용해 카운팅을 하면 위의 것을 단 한 줄로 줄일 수 있다.
Counter는 리스트의 원소들의 개수를 알고 싶을 때 사용한다.
from collections import Counter Counter('hello world') # Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})
+ 가장 많이 나타난 2개를 출력하려면? most_common(n=2)을 사용한다. 가장 흔하다는 의미로 많이 나타난 것을 반환한다.
다시 원래 코드로 돌아가 answer를 출력하면 Counter({'leo': 1})가 나온다.
from collections import Counter answer = Counter(participant) - Counter(completion)
같은 key를 기준으로 value 값을 빼준다는 것이 신기했고, 0이 되면 key-value 쌍이 삭제되는 것도 신기했다.
answer.keys()를 하면 dict_keys(['leo']) 객체를 돌려준다.
이 dict_keys객체를 리스트로 변환하려면 list()로 감싸준다.
그 다음 리스트의 첫번째 값을 빼오면 된다.
6. 깨달은점
- 값을 그대로 세서 비교해도 좋지만, 빼서 남은 것만 보는 것도 편리한 것 같다. 👍🏻
'🧠𝗔𝗹𝗴𝗼𝗿𝗶𝘁𝗵𝗺 > 💙프로그래머스' 카테고리의 다른 글
[코딩테스트 고득점 Kit / Level2 🧒🏻 / 완전탐색] 카펫(python) (0) 2021.06.27 [코딩테스트 고득점 Kit / Level2 🧒🏻 / 완전탐색] 소수찾기(python) (0) 2021.06.26 [코딩테스트 고득점 Kit / Level2 🧒🏻 / 정렬] 가장 큰 수(python) (0) 2021.06.26 [코딩테스트 고득점 Kit / Level1 👶🏻 / 정렬] K번째수(python) (0) 2021.06.26 [코딩테스트 고득점 Kit / Level2 🧒🏻 / 해시] 위장(python) (0) 2021.06.26