[프로그래머스] 완주하지 못한 선수 문제풀이 python

mauz·2022년 5월 23일
0

🐒 완주하지 못한 선수 문제풀이

https://programmers.co.kr/learn/courses/30/lessons/42576

✍ 나의 풀이

def solution(participant, completion):
    partc = dict()
    for runner in participant:
        if not runner in partc:
            partc[runner] = 1
        else:
            partc[runner] += 1
    for runner in completion:
        partc[runner] -= 1
        if partc[runner] == 0:
            partc.pop(runner)

    return list(partc.keys())[0]
정확성  테스트
테스트 1 〉	통과 (0.01ms, 10.2MB)
테스트 2 〉	통과 (0.01ms, 10.2MB)
테스트 3 〉	통과 (0.19ms, 10.2MB)
테스트 4 〉	통과 (0.65ms, 10.3MB)
테스트 5 〉	통과 (0.60ms, 10.3MB)

효율성  테스트
테스트 1 〉	통과 (28.50ms, 21.7MB)
테스트 2 〉	통과 (40.36ms, 25.2MB)
테스트 3 〉	통과 (44.95ms, 27.6MB)
테스트 4 〉	통과 (61.26ms, 33.9MB)
테스트 5 〉	통과 (57.18ms, 33.8MB)

채점 결과
정확성: 50.0
효율성: 50.0
합계: 100.0 / 100.0

딕셔너리의 key또는 item을 list()함수에 돌리면 iterable..


🧠 문제 이해

처음 생각한 풀이는 다음과 같았다.

def solution(participant, completion):
    participant = set(participant)
    return list(participant.difference(completion))[0]	#difference 메소드가 인자로 iterable을 받기에 사용함, completion 도 집합으로 선언하고 차집합으로 구하는 방법도 있음

파이썬의 집합에서 차집합을 찾아내는 메소드인 .difference()를 사용하여

전체 참가자중 완주한 사람들을 제외하면 완주하지 못한 사람이 나오므로 위와 같이 작성했으나,

3번 예제에서 문제가 발생했다.

participantcompletionreutrn
["mislav", "stanko", "mislav", "ana"]["stanko", "ana", "mislav"]"mislav"
예제 #3
"mislav"는 참여자 명단에는 두 명이 있지만, 
완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.

경주에서 동명이인이 있을때 집합은 중복을 제거하므로,
예제 3번에서 집합에 아무것도 남지않아 오류가 발생한다.

동명이인이 얼마나 있을지 모르기에
나는 participant 리스트를 돌면서 딕셔너리에 이름이 나온 횟수를 저장하고,
completion 리스트를 돌면서 딕셔너리에 저장된 횟수를 하나씩 줄였다.


🔍 다른 풀이

import collections


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

위 코드가 이 문제에 가장 많은 좋아요를 받은 풀이이다.

4줄짜리 코드로, 매우 깔끔하고 아마 문제에서 의도한 코드에 가깝지 않나 생각한다.

처음에 내가 집합으로 풀이를 시도했던 코드와 유사하다.


Counter

파이썬 내장 라이브러리인 collections엔 Counter 클래스가 있다.
이름 그대로 iterable 또는 mapping(딕셔너리)에서 요소의 개수를 세어주는 동작을 한다.

문자열에서 문자가 몇번 등장하는지, 리스트에서 요소가 몇번 등장하는지 세야할때 주로 사용된다.

Counter는 딕셔너리의 서브 클래스로 이루어져 있다. 요소가 key로 저장되고, 개수가 value로 저장된다.

파이썬 collecetions 라이브러리 공식문서

Counter는 합연산, 차연산 등을 수행 할 수 있다.

https://infinitt.tistory.com/183

Counter에서 갯수가 0이면 요소가 삭제되는 것 처럼 보인다.(공식 문서에서는 완전삭제하려면 del 메소드를 사용하란다.)


후기

내 코드가 다른 코드들 보다 조금은 빠르게 동작한다는 것에 위안을 삼는다 😇

profile
쥐구멍에 볕드는 날

0개의 댓글