매일공부

[코딩테스트 python] 해시 - 완주하지 못한 선수(효율성 개선) 본문

Programming/코딩테스트

[코딩테스트 python] 해시 - 완주하지 못한 선수(효율성 개선)

aram 2023. 4. 14. 01:27

 

 

프로그래머스

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

programmers.co.kr

 

처음 정확도 테스트는 바로 통과!
하지만 효율성에서 전체 실패....

from collections import Counter

def solution(participant, completion):
    p_cnt = Counter(participant)
    c_cnt = Counter(completion)
    answer = [p for p in p_cnt.keys() if (p not in completion) or (c_cnt[p] != p_cnt[p])]
    return s for s in answer

일반 for문보단 리스트컴프레션이
빠른 걸로 알고 있지만, 비교하는 과정에서 느려서 그런 듯

 

고민하다가 결국은 구글링했는데
sort로 정렬해서 풀는 방법도 있었지만,

collections의 Counter가 
dict형태로 반환해줘서 sort보다 훨씬 빠름.

기존 코드에서 고민하다가 
dict의 items를 보고 바로 해결!

from collections import Counter

def solution(participant, completion):
    p_cnt = Counter(participant)
    c_cnt = Counter(completion)
    for c, n in c_cnt.items():
        if c in p_cnt:
            p_cnt[c] = p_cnt.get(c) - n
            
    for p, n in p_cnt.items():
        if n == 1:
            return p

 

다른사람의 풀이를 보고
Counter는 리스트를 보고 연산이 된다는 사실을 깨달았다...

굳이 이렇게 for문으로 하지 않아도 되는 것..!!

 

728x90
Comments