이번에는 해시 테이블을 어떻게 활용하면 좋을지, 언제 활용하면 좋을지 알아보자.
특징:
1. "key:value" 쌍으로 저장
2. O(1)의 시간 복잡도로 복잡도가 낮음
3. in 을 활용할 수 있음
4. 추가, 수정, 불러오기 기능이 탁월
이러한 특징을 고려했을 때, 해시 테이블의 활용도는 정말 무궁무진하다.
1. 검증할 때
⇒ 있는지, 해당 부분이 있는지, 맞는지 이렇게 검증할 때 쓸 수 있다.
이 부분이 가장 강력하다. 해당 부분을 '검증' 이란 키워드로 표현해서 이해하기 어려울 수 있는데 쉽게 설명하면 다음과 같다.
2. 리스트를 쓸 수 있지만, 시간 복잡도를 고려해야할 때
배열 중 2개의 숫자를 더해서 M가 만들어지면 True, 아니면 False를 출력해라
의 문제에서 포인터를 쓸 수도 있고, for 문을 반복해서도 가능하다.
하지만 복잡도의 문제가 만만치 않아진다. 특히 배열이 길어질수록.
하지만 이것도 결과적으로 M가 되는지 '검증' 하는 문제기 때문에 딕셔너리로 쓸 수 있다.
딕셔너리의 key를 활용하면 되는데 예를 들어서 배열[i] + b = M일 경우, b가 딕셔너리에 있니?
라고 코드를 구현하면 매우 간단하고 빠르게 해결할 수 있다.
딕셔너리는 if, while을 써도(코드를 적절하게 작성한다면) O(n)의 시간 복잡도로 복잡한 문제를 해결할 수 있다.
리스트를 썼다면 전체를 봤을 걸, 딕셔너리로 짧게 가능하다는 것이다.
그러기 위해선, 문제를 잘 정의해야한다.
문제를 보고 답을 구하기 위해서 '조건'을 어떻게 구성할 것인가? 에 대해 꼼꼼하게 생각해야한다.
코드는 쉽게 말하면 1/2 이다.
여기에 있으면 하고, 없으면 말고. 제거하거나, 추가하거나.
이렇게 이분법적이다. 물론 가지치기를 할 수 있지만
내가 하고 싶은 말은, 처음에 코드를 구현할 때 애를 먹는게 이 조건이다. 어떻게 이 생각을 하지? 어떻게 이걸 이렇게 구현했지? 하는 생각이 들텐데 이럴 때 쉽게 생각하자
yes or no 로 나눌 수 있는 조건을 만들어보면 된다. 그렇게 조건을 추가하고 추가하면 된다.
사람인지라 우리 머리속에서는 이미 많은 단계의 연산이 거쳐서 그 행동을 하는 것이지만, 코드는 그렇지 않다. 그 사소한 행동을 모두 하나씩 적어야 하기 때문에 어렵게 생각하지 말고 조건을 하나씩 만들어서
큰 형태에서 작은 형태로 만들어 나간다! 는 느낌으로 조건을 생각하면 된다.
예를 들어서,
리스트에서 연속된 숫자가 몇개인지 구하고 싶을 때, 머리속에서는 쉽게 눈으로 따라가지만 코드는 그렇지 못하다.
따라서 하나의 스텝씩 밟아보자.
1. 정렬을 한다.
2. 앞에 숫자 + 1이 뒤의 숫자인지 확인한다.
3. 맞으면 계속 진행, 틀리면 다시 리셋
이런식으로 한 스텝씩 생각하면 문제를 해결하는데 도움이 된다!
더 나아가서는 예외처리(0일 땐 어떻게?)도 해야하지만..
우선은 하나씩 스텝을 밟아나가면서 코드를 구현해보자.
'코딩 테스트' 카테고리의 다른 글
[09-1] 트리(Tree)란? (0) | 2023.11.15 |
---|---|
[08-1] 재귀(Recursion)란? (1) | 2023.11.15 |
[07-2] 해시 테이블(Hash Table)이란? (2) (1) | 2023.11.14 |
[07-1] 해시 테이블(Hash Table)이란? (1) (1) | 2023.11.14 |
[06-2] Stack은 어떻게 쓸까? (1) | 2023.11.09 |