완주하지 못한 선수
문제 설명
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 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차 제출 코드
def solution(participant, completion): for comp in completion: if comp in participant: participant.remove(comp) return participant[0]
문제를 이해하고 처음에 작성했던 코드는 차집합을 구하면 되는 문제이니
-
연산을 지원하는set()
을 이용하여 문제를 풀려고 했다.그러나
set
자료구조는 중복을 허용하지 않기 때문에 동명이인이 존재하는 테스트케이스를 통과하지 못했다.그래서 다음으로
list
를 이용하여 위와같이 코드를 작성했다.완주자 배열
completion
을 순회하며 각각의 원소들이 참가자 배열participant
에 있는 경우, 해당 원소를remove
했다.또한,
참가자 - 완주자 = 1
이 정해져 있던 rule이기 때문에list[0]
을 return 하여 완주하지 못한 선수를 반환하였다.그 결과, 모든 테스트케이스는 통과하였으나 효율성 테스트에서 처참히 무너졌다..
for
문 안에서if
문을 통해 길이n
인 participant 배열의 원소들을 하나하나 확인해야 하니 돌이켜보니 매우 비효율적으로 느껴지긴 한다.
2차 제출 코드
def solution(participant, completion): completion.append('z') for part, comp in zip(sorted(participant), sorted(completion)): if part != comp: return part
위 코드 같은 경우에는 이전 1차 제출 코드에서 불합격을 했던 효율성 테스트를 통과하였다.
배열 정렬을 위하여 completion 배열에 알파벳
z
를append
하였다.그 이후,
zip()
을 통해 같은idx
에 존재하는 원소를 비교하기 위하여sorted(participant)
와sorted(completion)
에서 원소를 하나씩 가져와서 비교하였다.이전에는 한개씩 비교하던걸 두개씩 비교하게 진행하였다.
이와 같이 비교를 진행하면서 만일 두 원소가 서로 다를경우에는
participant
배열의 원소를 반환한다.
다른 사람의 풀이
import collections def solution(participant, completion): answer = collections.Counter(participant) - collections.Counter(completion) return list(answer.keys())[0]
....할많하안....
collections
모듈을 이용하여 간결하게 짜셨다.collections
collections
모듈은 파이썬의 범용 내장 컨테이너dict
,list
,set
등에 대한 대안을 제공하는 특수 컨테이너 자료형을 구현한다.
Counter
는hasable
한 객체를 세기 위한dict
의 서브 클래스다.요소가 딕셔너리 key로 저장되고 개수가 value로 저장되는 컬렉션이다.
위 예시의 반환값을 가공하지 않고 그대로 반환하는 예시를 살펴보자
import collections def solution(participant, completion): answer = collections.Counter(participant) - collections.Counter(completion) return answer print(solution(['marina', 'josipa', 'nikola', 'vinko', 'filipa'], ['josipa', 'filipa', 'marina', 'nikola'])) print(solution(['mislav', 'stanko', 'mislav', 'ana'], ['stanko', 'ana', 'mislav'])) ''' Counter({'vinko': 1}) Counter({'mislav': 1}) '''
결과와 같이 answer는
Dict
Type이다.원소값이
dict
의key
로 저장되고, 해당 원소의 개수가value
로 저장된다.마저 다른 사람 풀이 코드 설명을 진행하겠다.
해당 코드는
collections.Counter()
를 통해participant
리스트와completion
리스트 내 원소값들을{ 원소 : 개수 } 형태의
dict
로 만든 후-
연산을 통해 완주하지 못한 사람을 찾아냈다.기본
dict
자료형은-
연산을 진행하지 않아collections.Counter()
를 이용한 건 정말 센스있었다.. **
'Algorithm & SQL > Programmers' 카테고리의 다른 글
[Algorithm] [Python] Programmers - 같은 숫자는 싫어 (0) | 2019.10.22 |
---|---|
[Algorithm] [Python] Programmers - 가운데 글자 가져오기 (0) | 2019.10.22 |
[Algorithm] [Python/Swift] Programmers - K번째 수 (0) | 2019.10.22 |
[Algorithm] [Python] Programmers - 하샤드 수 (0) | 2019.10.17 |
[Algorithm] [Python] Programmers - 정수 제곱근 판별 (0) | 2019.10.17 |