programmers lv1 완주하지 못한 선수 python
문제 :
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때,
완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
제한사항
- 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
- completion의 길이는 participant의 길이보다 1 작습니다.
- 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
- 참가자 중에는 동명이인이 있을 수 있습니다.
출처 : 프로그래머스 Level1
보자마자 엥 정말 간단한 문제네?! 두 개의 배열을 비교하면 되겠구나 라고 생각을 했습니다.
정말 중요한 제외사항인 ‘참가자 중에는 동명이인이 있을 수 있습니다.’ 라는거죠.
첫 번째 풀이(시간 초과)
제가 첫 번째 방법 풀이로는
[1] 두 개의 배열을 sort()를 이용해 먼저 정렬하자
[2] 참가자 기준으로 배열에서 아이템을 가져와 완주한 사람들의 목록에서 찾아보자
[3] 동명이인이 있는 경우가 있으니 count()를 이용해 개수를 확인해보자.
def solution(participant, completion):
participant.sort()
completion.sort()
for item in participant:
# 동명 이인을 판단해야 한다.
if not item in completion or completion.count(item) < participant.count(item):
return item
정확도는 올바르게 출력하나 시간이 초과된다.
두 번째 풀이(정답)
[1] collections.Counter() 모듈을 사용한다.
- collections.Counter()의 결과는 딕셔너리로 반환됩니다.
- word count로도 유용하게 사용이 가능하니 기억합시다. return 결과는 Dictionary 형태로 반환됩니다.
[2] 2개의 딕셔너리를 빼서(dictionary subtract) 차집합을 구한다
[3] 최종 원하는 값은 keys 값이다
- Counter({'mislav': 1}) -> list( .keys())[0]으로 원하는 이름 값을 뺀다
def solution(participant, completion):
answer = collections.Counter(participant) - collections.Counter(completion)
return list(answer.keys())[0]
과정들은 print로 뽑아봤습니다.
'Algorithm' 카테고리의 다른 글
programmers lv1 체육복 python (0) | 2019.09.18 |
---|---|
programmers lv1 모의고사 python (0) | 2019.09.18 |
GA 알고리즘 Google Chrome의 Dinosaur 게임 (0) | 2018.07.26 |
Algorithm - Recursion - 2 (0) | 2016.10.10 |
Algorithm - Recursion 1 (1) | 2016.10.07 |