m1ndy5's coding blog

프로그래머스 완주하지 못한 선수 with Python 본문

알고리즘 with python/20240909

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

정민됴 2024. 9. 10. 21:11

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

set으로 접근했다가 동명이인이 있다는 조건을 발견하고 dictionary로 풀었다.

from collections import defaultdict

def solution(participant, completion):
    answer = ''
    d = defaultdict(int)
    
    for name in participant:
        d[name] += 1
        
    for name in completion:
        d[name] -= 1
        
    for key, value in d.items():
        if value == 1:
            answer = key
            break
        
    return answer

 

뭔가 포문을 3번 도는게 마음에 안들어서 다른 사람 코드를 확인했더니

import collections


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

요런 초 심플한 코드를 발견할 수 있었다,,,

 

collections.Counter(배열) 이렇게 넘기면 각 원소가 몇 번씩 나오는지 저장된 객체를 얻게 된다.

>>> Counter(["hi", "hey", "hi", "hi", "hello", "hey"])
Counter({'hi': 3, 'hey': 2, 'hello': 1})

키로 값을 읽을 수도 있고 value값을 갱신할 수도 있다.

counter = Counter("hello world")
counter["o"], counter["l"]
(2, 3)

counter["l"] += 1
counter["h"] -= 1
Counter({'h': 0, 'e': 1, 'l': 4, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1})

 

또한 in을 사용하여 특정 key가 counter에 존재하는지도 파악할 수 있다.

o in counter
o not in counter

counter끼리 빼기도 된다니!

신기한 지식이었다.