본문 바로가기
코딩 테스트

[07-2] 해시 테이블(Hash Table)이란? (2)

by 너티드코오딩 2023. 11. 14.

앞서 해시 테이블의 정의와 간단한 사례를 봤다면, 언제 써야하는지? 어떤 연산이 중요한지 살펴보겠다.

그 전에 한번 요약정리 하고 넘어가보자.

 

1. key-value쌍이다

2. key를 index로 매칭하는 과정에서 hashfunction이 활용된다. 이유는 최적화와 효율성의 문제

3. 하지만 복잡하게 신경쓰지 말자. 파이썬에서 알아서 해주니, 우리는 key-value만 이해해도 충분하다!(적어도 코테에서는..)

 

해시 테이블의 대표적 사례는 딕셔너리이고, 딕셔너리의 장점을 확인해보자.

내가 운동 루틴을 만들어보려고 한다. 운동은 유산소, 가슴, 허리, 등, 유산소 의 순서로 이어진다.

#오늘의 운동 루틴 만들기(리스트)
routine = [30, 15, 60, 30, 10] #유산소, 가슴, 허리, 등, 유산소

 

리스트를 활용하면, 이렇게 숫자만 덜~렁 나오게 된다. 그래서 이게 뭐였더라..? 주석이 없다면 이해하기 어렵다. routine[2]가 뭐였지? 이런 경험이 있을 것이고, 지금이야 5개의 값으로 구성되었지만 10개, 100개 그 이상이라면? 벌써부터 머리가 아파온다.

 

#오늘의 운동 루틴 만들기(딕셔너리)
routine = {"running_first":30,
            "chest":15,
            "waist":60,
            "back":30,
            "running_last": 10}

 

괄호를 활용해서 딕셔너리를 만들었고, key를 넣으니 value가 무엇을 의미하는지 쉽게 알수 있었다!

주의해야할 점은 key가 동일해서는 안된다. 유산소가 2번이지만 뒤에 first, last를 붙이듯 서로 다른 key를 가져야한다. 쉽게 생각하면, 인덱스가 여러개인 경우는 없잖아?

 

딕셔너리를 활용하는 방법도 매우 쉽다.

 

#첫뻔재 유산소를 출력
print(routine['running_first']

#등 운동의 값을 변경
routine['back'] = 20

#다리 운동 추가
routine['leg'] = 10

 

리스트 쓰듯이 활용하면 정말 쉽다. 출력, 변경, 추가까지 key-value만 이해하면 된다.

 

여기까지는 쉽고, 그렇다면 딕셔너리의 최고 강점은 무엇일까?

바로... "있냐?"

 

코딩테스트 문제를 보다보면 얘가 여기 있는지 확인해서 있다면~ 없다면~ 하는 문제를 본 적이 있다.

이때 딕셔너리를 쓰면 매우 효과적이다. 예시를 보자.

#팔운동을 하는 날인가?
if 'arm' in routine:
    print("오늘은 팔운동 하는날")
else:
    print("오늘은 팔운동 쉬는날")

 

쉽게 설명하면 이렇다. 오늘 팔 운동 하는 날인지 궁금하다면 루틴에서 팔운동이 key로 있는지 in을 활용해서 확인하면 된다. 만약에 팔운동을 하고싶어! 60분을 해야겠어. 근데 오늘 루틴에 있는지 모르겠어? 하면 이렇게 하면 된다.

 

if 'arm' in routine and routine['arm'] ==60 :
    print("팔운동 60분 하는날"]
else:
    routine['arm'] = 60

 

루틴에 팔이 있고 ,60분이면? 하는날이라고 출력!

아니라면? 오늘 루틴에 팔 60분 추가(또는 수정이겠지?)!!

 

이 과정에 O(1)로 가능하기 때문에 엄청난 효율을 보여주고 있다. 따라서 딕셔너리는 그야말로 엄청난 녀석이라는 것이다.

 

Hast Table 총정리

 

장점

1. key-value라서 복잡한 내용을 저장할 때 매우 유용하다.

2. in 을 활용하면 확인, 수정, 검증 등 활용도가 매우 높아진다.

3. O(1)의 복잡도를 갖고 있기 때문에 코딩테스트에서 시간복잡도를 줄여주는 핵심이다.

 

단점

1. 내부동작이 약간 복잡하다? 하지만 코딩 테스트에서는 몰라도 풀 수 있다.

 

 

총평

한번쯤은 생각해보았던 기능을 갖고 있어서 매우 유용함