꿈이 너무 많은 한 대학생의 공간

프로그래머스 - 완주하지 못한 선수(해시) 본문

알고리즘/프로그래머스

프로그래머스 - 완주하지 못한 선수(해시)

청울울청 2020. 7. 7. 11:11

1. collections 모듈을 사용한 풀이

import collections

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

 

import collections

collections 모듈을 가져옵니다.

def solution(participant, completion):
    players = collections.Counter(participant)
    completed = collecions.Counter(participant)

solution이라는 함수는 참가자 목록과 완주자 목록을 인자로 받습니다. (프로그래머스 첫 세팅)

collections.Counter 함수는 인자로 리스트를 받으며 해당 리스트의 문자열을 딕셔너리화시켜 각각 문자열이 몇 번 들어가있는지를 값으로 놓습니다. 

lists = ["a", "b", "c", "a", "a", "c"]

print(collections.Counter(lists))
# { "a" : 3, "b" : 1, "c" : 2 }

즉 위 코드를 실행하면 다음과 같은 형태로 출력되게 됩니다.

심지어 collections.Counter 함수로 만들어진 딕셔너리는 덧셈 뺄셈이 가능합니다. 이를 이용해 참가자 목록에서 완주자 목록을 빼면 완주하지 못한 사람들의 목록만 남는 것입니다.

이는 딕셔너리 형태이므로 딕셔너리의 키를 keys() 함수로 리스트로 받습니다.

처음 시도했을 때에는 단순히 keys()로 받은 리스트의 첫번째 인덱스를 받아오면 완주하지 못한 사람을 받아올 수 있을거라고 생각했지만(문제 내에서 completion의 길이는 participant의 길이보다 1 작으므로 완주하지 못한 사람은 1명입니다) keys()로 받아온 인자는 인덱스 연산이 불가능하더군요. 그래서 list() 함수로 다시 리스트화 시킨 다음에 인덱스 연산으로 받아왔습니다.

    answer = players - completed
    
    return list(answer.keys())[0]

저번에 코드페어 문제에서도 이와 비슷한 유형의 문제가 있었는데 collections 모듈을 몰라서 못 풀었습니다. 그 후 그 문제를 collections로 쉽게 풀 수 있는 걸 알게 되어서 굉장히 후회했던 기억이 나네요...

 

하지만 문제는 해쉬 알고리즘으로 풀으라 해서 다른 방법을 찾는 중입니다. 찾게 된다면 수정해서 다시 올리겠습니다.

Comments