프로그래머스 코딩테스트 알고리즘 고득점 Kit
문제이름
문제 설명
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
제한사항
- 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
- completion의 길이는 participant의 길이보다 1 작습니다.
- 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
- 참가자 중에는 동명이인이 있을 수 있습니다.
나의 풀이
python의 Counter 객체를 활용하였다. 참가자 중에는 동명이인이 있을 수 있기 때문에, set을 사용할 수 없었다.
그래서 Counter 객체로 participant를 딕셔너리로 만들고, completion 리스트를 for문으로 돌면서 인원 수를 하나씩 줄여나가며 0이 되면 딕셔너리에서 삭제하는 방식으로 코드를 짰다.
그리고 마지막에 딕셔너리에는 단 한명의 참가자만 남기 때문에, 남은 유일한 키를 반환하기 위해 iter과 next 함수를 사용했다.
iter(participants.keys())
는 키들을 iterator로 변환한다.next()
는 iterator에서 첫 번째(또는 유일한) 키를 꺼내준다.
from collections import Counter
def solution(participant, completion):
participants = Counter(participant)
for c in completion:
if c in participants:
participants[c] -= 1
if participants[c] == 0:
del participants[c]
# 남은 유일한 키를 반환
return next(iter(participants.keys()))
그런데 다른 사람의 풀이를 보니,, 아주 깔끔하고 통쾌한 답안이 있었다.
Counter 객체는 뺄셈 연산(차집합)도 가능하다는 것!!
Counter 객체끼리의 뺄셈 연산을 활용하여, participant에만 남아 있는 사람의 카운트를 얻는다.
그리고 객체의 키들을 리스트로 만들어 그 중 첫번째 값을 가져온다.
import collections
def solution(participant, completion):
answer = collections.Counter(participant) - collections.Counter(completion)
return list(answer.keys())[0]
[Python] 파이썬 Counter 객체 활용 방법 정리
[Python] 파이썬 Counter 객체 활용 방법 정리
Counter 객체아이템에 대한 개수를 계산해 딕셔너리로 리턴해주는 아주 유용한 객체이다.importCounter 객체는 Python의 collections 모듈에 포함된 해시 가능한 객체의 개수를 셀 때 유용한 클래스이다.특
ynslee627.tistory.com