본문 바로가기

알고리즘/프로그래머스

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

완주자의 이름을 key로 인원수를 value로 잡고, c_dic에 저장했다.

그리고 참가자 이름을 하나씩 꺼내서 비교했다. key에 해당 참가자 이름이 없거나 value에 해당 참가자 수가 0명이면, 그 사람은 완주하지 못한 참가자이다. 

 

 

def solution(participant, completion):
    c_dic = {}

    for key in completion:
        if not c_dic.get(key, 0):
            c_dic[key] = 1
        else:
            c_dic[key] += 1

    for key in participant:
        if (not c_dic.get(key, 0)) or c_dic[key] == 0:
            return key

        else:
            c_dic[key] -= 1

 

 

입력으로 'Hello'가 들어왔을 때, 'H'나 'He' 이런 식으로 문자열을 부분으로 확인해야 한다면 트라이를 이용하는 것이 좋다.

하지만 문자열을 통째로 본다면 해시를 쓰는 것이 좋다. 딕셔너리를 이용했다.

 

 

백준이 아닌 알고리즘 사이트에서 문제를 푼 적은 처음이다.

프로그래머스는 정확성뿐만 아니라 효율성까지 신경을 써야 통과한다.

아래는 효율성에서 통과하지 못해서 틀린 코드이다.

 

 

from collections import defaultdict


def solution(participant, completion):
    completion_names = defaultdict(int)

    for p_name in completion:
        completion_names[p_name] += 1

    for name in participant:
        if name not in participant or completion_names[name] == 0:  # 명단에 없거나 동명이인 기회 다 썼거나
            return name

        completion_names[name] -= 1

 

 

아마 defaultdict 때문인 것 같다.

 

 

 

추가로 딕셔너리 사용법 중에 get, pop에 대해 알아보자.

 

 

1. .get(key, default)

 

 

get

 

 

key가 있다면 대응하는 value를 반환한다.

key가 없다면 대응하는 default를 반환한다.

 

 

 

2. .pop(key, default)

 

 

pop

 

 

key가 있다면 대응하는 value를 반환하고, 해당 key를 delet시킨다.

key가 없다면 대응하는 default를 반환고, 해당 key를 delet시킨다.

 

 

 

다른 사람 풀이도 보자.

 

 

import collections


def solution(participant, completion):
    answer = collections.Counter(participant) - collections.Counter(completion)
    return list(answer.keys())[0]

 

 

이 코드를 이해하기 위해서 counter에 대해 알아보자.

 

counter는 collections 모듈의 클래스이다. 딕셔너리를 이용해 데이터 개수를 셀 때 유용하다.

 

 

Counter()

 

 

Count 클래스는 most_common 함수를 가지고 있다. 데이터 개수가 많은 순서로 정렬된 리스트를 반환한다.

most_common에 몇 개를 원소로 리스트를 만들지 인자로 줄 수 있다. most_common(1)하면 [('a', 3)]이 반환된다.

 

Counter().most_common()

 

 

이제 다시 다른 사람 코드를 보자.

리스트가 Counter의 인자로 들어왔기 때문에, key는 리스트의 값이고 value는 해당 key의 개수인 딕셔너리를 반환하게 된다.

 

참가자 - 완주자를 해서 남는 한 명의 참가자를 찾는다.