본문 바로가기
Programmers/Solution

[프로그래머스] 해시 > 완주하지 못한 선수

by Ratataca 2022. 1. 12.

완주하지 못한 선수

문제

  • 수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
  • 입력
    • participant: 마라톤에 참여한 선수들의 이름이 담긴 배열
    • completion: 완주한 선수들의 이름이 담긴 배열
  • 출력
    • 완주하지 못한 선수의 이름을 return 하도록 solution 함수

 

제한사항

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

 

예시

participant completion return
["leo", "kiki", "eden"] ["eden", "kiki"] "leo"
["marina", "josipa", "nikola", "vinko", "filipa"] ["josipa", "filipa", "marina", "nikola"] "vinko"
["mislav", "stanko", "mislav", "ana"] ["stanko", "ana", "mislav"] "mislav"

 

예시 설명

  • 예제 #1
    • "leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.
  • 예제 #2
    • "vinko"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.
  • 예제 #3
    • "mislav"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.

 

구현 아이디어

  1. 문제에서 참여자와 완주자 명단을 이용해서 완주하지 못한 1인 찾기
  2. 동명이인 고려 ⇒ 자료구조를 dict으로 key : 이름, value : 인원 수
  3. 해당 자료구조로 참여 인원 증가, 완주 인원 차감
  4. 결과출력에서 value가 1인 참여자 이름을 반환

 

코드

from collections import defaultdict

def solution(participant, completion):
    
    # 1. participant 관련 counter 딕션너리 정의
    counter = defaultdict(int)
    
    for p in participant:
        counter[p] += 1

    # 2. completion 선수들을 조회하면서 counter 카운터 차감
    for p in completion:
        counter[p] -= 1
		
		# 3. 결과 출력
    answerd = [str(k) for k, v in counter.items() if v == 1]
    return answerd[0]

 

문법 정리

  • defaultdict(default_factory=None)
    • 새로운 사전 객체를 반환하
    • default_factory : 속성의 초기 값, 기본값은 None
class collections.defaultdict(default_factory=None /[, ...])

 

  • 예제 1. List
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:
    d[k].append(v)

sorted(d.items())

>>> [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

 

  • 예제 2. 문자열
s = 'mississippi'
d = defaultdict(int)
for k in s:
    d[k] += 1

sorted(d.items())
>>> [('i', 4), ('m', 1), ('p', 2), ('s', 4)]

 

  • 예제 3. Set
s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
d = defaultdict(set)

for k, vin s:
	d[k].add(v)

sorted(d.items())
>>> [('blue', {2, 4}), ('red', {1, 3})]

댓글