본문 바로가기
Programming Language/Python

[Python] 자료구조 : Hash

by 홍월이_ 2022. 12. 27.

아래 내용들은 제가 혼자 학습하면서 정리한 내용들입니다.

'부족한 내용' 혹은 '잘못된 내용'이 있을 수 있습니다.

댓글 남겨주시면 더욱 공부하고 수정하도록 하겠습니다.

감사합니다.


Hash(해시) 자료구조에 대한 공부!

코딩 테스트 등에서 출제 빈도가 높다고 해서 따로 한번 정리해 보았다.

 

Hash?

  • 대표적인 자료 구조 중 하나로써, Key & Value로 구성되어있어 데이터 검색과 삽입, 추출 등의 작업에서 빠른 속도로 작업을 완수할 수 있다.
  • 해시를 쓰지않고 리스트와 같은 자료형을 사용할 경우 전체 자료구조를 검색하기때문에 효율성이 떨어진다.
  • 파이썬에서는 Dictionary 자료구조가 Hash 형태로 구현되어 있다.

 

Hash 사용하기

해시가 빠르다는건 알겠다. 그렇다면 언제 사용하면 좋을까?

1. 리스트를 사용할수 없는 경우

리스트는 인덱스를 접근할때 숫자 인덱스를 이용하여 접근한다. 하지만 인덱스 값이 숫자가 아닌 문자열이라면? 이럴 때에는 리스트보다는 딕셔너리를 사용하는 것이 좋다.

 

2. 빠른 검색 / 추출 등이 필요할 때

위에서도 말했지만 해시 자료구조는 속도적인 면에서 리스트보다 훨씬 빠르기 때문에 빠른 속도가 필요할때 사용하면 좋다.

Hash 와 List 의 시간복잡도 비교

Operation Dictionary List
Get Item O(1) O(1)
Insert Item O(1) O(1) ~ O(N)
Update Item O(1) O(1)
Delete Item O(1) O(1) ~ O(N)
Search Item O(1) O(N)
Index O(1) O(1)
Store O(1) O(1)
Length O(1) O(1)
Pop O(1) O(N)
Remove - O(N)
Sort - O(N Log N)
Iteration O(N) O(N)
Check = =, ! = - O(N)

 

3. 집계가 필요 할 때

원소의 갯수를 세거나 차이를 비교할 때, 해시와 collections 모듈의 Counter 클래스 등을 사용하면 훨씬 빠르게 문제를 해결할 수 있다.

 

사용 예

딕셔너리의 자세한 사용법은 생략하고 프로그래머스 예제와 함께 List와 비교해보도록 하자

  • 문제
 

프로그래머스

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

programmers.co.kr

  • 입출력 예

입출력 예처럼 participantcompletion이라는 두 리스트를 비교해서 participant 에는 있지만 completion에는 없는 원소값을 리턴하는 문제이다.

 

List를 이용한 문제 풀이

def solution(participant, completion):
    for i in completion:
        participant.remove(i)
    return participant[0]

처음에는 위와 같이 List를 이용하여 문제풀이를 진행했다.

전제 리스트 길이만큼 반복하여 탐색하기 때문에 시간이 오래 걸리고, 결과적으로 효율성 테스트에서 시간초과가 걸려서 문제를 통과하지 못했다.

 

Dictionary를 이용한 문제 풀이

def solution(participant, completion):
    dic = {}
    for p in participant:
        if p not in dic: # key
            dic[p] = 0
        dic[p] += 1
    for c in completion:
        dic[c] -= 1
        if dic[c] == 0:
            del dic[c]
    return list(dic.keys())[0]

딕셔너리를 이용하여 문제를 풀이해주면 효율성 테스트도 통과하여 정답을 맞출수 있었다.

앞으로 원소를 검색하거나 더 빠른 속도로 문제를 해결해야 할 때에는 해시를 기억하고 활용해보도록 해야겠다!

 

 

Hash, Dictionary에 대한 추가 자료

딕셔너리(Dictionary)

 

딕셔너리(Dictionary)

dic_name = {'이름':'유나','phone':'01012345678','birth':'20201228'} dic_wintable = {'가위':'보','바위':'가위','보':'바위'} 이처럼 python에서 많이 사용되는 딕셔너리(Dictionary) 는 가위바위보 테이블 처럼 여러 값을

yunaaaas.tistory.com

리스트(List) / 딕셔너리(Dictionary) 정렬

 

리스트(List) / 딕셔너리(Dictionary) 정렬

지난 글에 이어 리스트 정렬에 관해 정리해보고자 합니다! 리스트(list) 자료형과 딕셔너리(dictionary) 자료형에 대해 헷갈리신다면 ?! 아래 글을 읽고 오시면 이해하시기 더 쉬우실 거예요 : ) 리스

yunaaaas.tistory.com

 

Reference

TimeComplexity - Python Wiki

 

TimeComplexity - Python Wiki

This page documents the time-complexity (aka "Big O" or "Big Oh") of various operations in current CPython. Other Python implementations (or older or still-under development versions of CPython) may have slightly different performance characteristics. Howe

wiki.python.org

[Python 자료구조] Hash(해시)

 

[Python 자료구조] Hash(해시)

파이썬에서 해시(Hash)는 어떻게 구현할 수 있을까요!? 파이썬에서는 Dictionary 라는 자료구조를 통해 해시를 제공합니다. 그리고 Dictionary는 dict클래스에 구현되어있습니다! 해시 언제 사용하면 좋

yunaaaas.tistory.com

[Python 파이썬] 해시 (Hash) 해싱 (Hashing) 알고리즘 예제로 알아보기

 

[Python 파이썬] 해시 (Hash) 해싱 (Hashing) 알고리즘 예제로 알아보기

파이썬 코딩테스트에 출제 빈도가 높은 파이썬 '해시' 에 대해 알아보기 해시 / 해싱 / Hash / Hashing - 데이터를 빠르게 넣거나 or 가져올 때 사용하는 기법 : 해시로 풀어야하는 코딩 테스트의 경우

codingpractices.tistory.com

[Python] List, Dict 시간 복잡도 (Big O)

 

[Python] List, Dict 시간 복잡도 (Big O)

시간 복잡도 내가 작성한 코드가 과연 잘 작성한 것일까? 라는 질문에 답변하기 위한 기준은 여러가지가 있습니다. 여러 기준 중에서 시간 복잡도라는 기준이 있습니다. 이 코드는 몇 시간 짜리

gomguard.tistory.com

 

댓글