BOJ/Python

[프로그래머스] 해시 파이썬

띵지니어 2024. 3. 23. 05:46

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

 

프로그래머스

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

programmers.co.kr

 

 

내 코드

from collections import defaultdict

def solution(participant, completion):
    hash_table = defaultdict(int)
    for i in participant:
        hash_table[i] += 1
        
    for i in completion:
        hash_table[i] -= 1
        if hash_table[i] == 0:
            del hash_table[i]
    return list(hash_table.keys())[0]

해당 코드는 O(N)의 시간 복잡도를 가집니다.


Review

처음에 문제를 풀 때는 O(N²)의 시간 복잡도로 문제를 풀었습니다.

처음에 작성한 코드는 아래와 같습니다.

# 효율성 케이스에서 탈락한 코드
def solution(participant, completion):
    for i in participant:
        if i not in completion:
            return i
        else:
            completion.remove(i)

 

의 시간 복잡도가 걸리는 이유:

for 문 : O(N)

remove() 함수 시간 복잡도 : worstcase 일 경우 O(N)

그래서 이렇게 뜨면 매우 정상이에요


따라서 문제에 의도대로 O(N²) 보다 낮게 문제를 풀어야겠다고 생각했습니다.

저는 딕셔너리를 사용했습니다.
defaultdict 은 초기 키값이 없을 때 유용하게 사용할 수 있는데요

defaultdict에 대한 설명은 아래 링크 참고 부탁드립니다!
https://thingjin.tistory.com/entry/Python-defaultdict-%EB%94%95%EC%85%94%EB%84%88%EB%A6%AC-%EA%B8%B0%EB%B3%B8%EA%B0%92-%EC%84%A4%EC%A0%95%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95

 

[Python] defaultdict 딕셔너리 기본값 설정하는 방법

딕셔너리에 대한 문제 해결을 하면서 keyError를 처리하기 위해, key 값과 value 값을 넣어서 초기화를 해준 기억이 있다. 대표적으로 문자열에서의 쓰인 알파벳 개수를 판단하기 위해 사용하면 편리

thingjin.tistory.com


입출력 예 3번을 예시로 보겠습니다.

입출력 3번

for i in participant:
    hash_table[i] += 1

# defaultdict(<class 'int'>, {'mislav': 2, 'stanko': 1, 'ana': 1})

1. 해당 코드를 적용하면 주석과 같은 결과 값이 나옵니다.

 

for i in completion:
    hash_table[i] -= 1
    if hash_table[i] == 0:
        del hash_table[i]

2. completion을 순회하면서 완주를 한 사람이면 1씩 빼주고
이후 0이면 그 해시테이블에서 빼주는 식으로 코드를 짰습니다.

 

return list(hash_table.keys())[0]

3. 마지막으로 딕셔너리키값의 하나남은 원소를 return 해주면 됩니다.

 

 

참고로 딕셔너리의 del은 선형시간 = O(1)으로 값을 제거 할 수 있습니다.

del hash_table[i]

딕셔너리 같은 경우 리스트(배열) 과 달리 선형시간O(N)으로 값 제거 

 

 

다른 풀이 방법이 있다면 댓글로 공유 부탁드립니다.
( ̳• ·̫ • ̳)

질문이나 지적할 사항 있으면 언제든지 의견 주세요
( •́ .̫ •̀ )

 

'BOJ > Python' 카테고리의 다른 글

백준 7568번 덩치 파이썬  (0) 2024.03.22
백준 14502번 연구소 파이썬 BFS  (0) 2024.03.20
백준 14719번 빗물 파이썬  (0) 2024.03.19
백준 1966번 프린터 큐 파이썬  (0) 2024.03.08
[프로그래머스] 의상 파이썬  (1) 2024.02.12