머리말

본 게시물은 프로그래머스의 문제에 대해 Python으로 작성한 개인 답안입니다.

문제의 원본은 다음 링크를 참고해주시기 바랍니다. (Link)


문제

코딩테스트 연습 > 해시 > 완주하지 못한 선수

문제 설명

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

마라톤에 참여한 선수들의 이름이 담긴 배열 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는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한 명은 완주하지 못했습니다.


문제 해석

프로그래머스에서는 위 문제를 '해시'를 이용해 풀이하도록 제시한다.

문제의 조건을 살펴보았을 때, 단 한 명의 선수가 누구인지 찾기만 하면 된다.

즉, participant에는 존재하나, completion에는 존재하지 않는 선수를 찾으면 된다.

동명이인을 유의하여 participantcompletion의 차이를 구하는 코드를 구현하면 되겠다.

collections.Counter()를 활용해 각 리스트의 요소별 개수를 구하고 차이를 구하겠다.


전체 코드

import collections

def solution(participant, completion):
    p_cnt = collections.Counter(participant)
    c_cnt = collections.Counter(completion)
    p_cnt.subtract(c_cnt)

    return list(p_cnt.elements())[0]

코드 해석

p_cntc_cnt는 각각 participantcompletion에서 요소별 갯수를 갖는 Counter객체이다.

Counter 객체는 Key와 Value를 쌍으로 가지는 형태의 객체로, 예시는 다음과 같다.

>>> participant = ["mislav", "stanko", "mislav", "ana"]
>>> p_cnt = collections.Counter(participant)
>>> p_cnt
Counter({'mislav': 2, 'stanko': 1, 'ana': 1})

Counter 객체는 subtract()라는 메서드를 가지고, 이는 전달받은 객체에 해당하는 key의 value를 차감하는 연산을 수행한다.

>>> p_cnt
Counter({'mislav': 2, 'stanko': 1, 'ana': 1})
>>> c_cnt
Counter({'stanko': 1, 'ana': 1, 'mislav': 1})
>>> p_cnt.subtract(c_cnt)
>>> p_cnt
Counter({'mislav': 1, 'stanko': 0, 'ana': 0})

위와 같이 subtract() 메서드는 value가 0 이하로 내려가더라도 key값을 제거하지 않는다.

Counter 객체의 elements() 메서드는 객체가 가진 key를 반환하나, value가 0인 key는 반환하지 않는다.

>>> p_cnt.elements()
<itertools.chain object at 0x00000200F8CD0850>
>>> list(p_cnt.elements())
['mislav']

elements() 메서드로부터 반환된 객체는 제네레이터이기 때문에, list()로 형 변환하여 인덱스로 접근하면 되겠다.

'Practice Python > 프로그래머스' 카테고리의 다른 글

[프로그래머스] 모의고사  (0) 2021.01.18
[프로그래머스] K번째 수  (0) 2021.01.17

+ Recent posts