Notice
Recent Posts
Recent Comments
Today
Total
05-07 02:02
Archives
관리 메뉴

Jeongchul Kim

programmers lv1 완주하지 못한 선수 python 본문

Algorithm

programmers lv1 완주하지 못한 선수 python

김 정출 2019. 9. 18. 18:06

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
Comments