해시 Hash 알고리즘
1. 개념
- Key : Value 형태를 갖는 자료구조
- 전화번호부를 생각하면 이해하기 쉬움
- 이름 = Key, 전화번호 = Value
- 무언가 찾기 위한 검색어 = Key, 검색 결과 = Value
종류 | 배열 | 해시 |
내용 | 정수로만 접근할 수 있음 | String type이나 다른 어떤 데이터형을 기반으로 자료구조 접근, 데이터 관리 가능 = 모든 Data type으로 접근이 가능함 |
예시 | 친구 이름을 알아도 전화번호를 검색할 수 없음 → For문을 끝까지 돌려서 내가 찾는 친구가 맞는지 확인해야 함 | 전화번호부 |
장점 | 구현이 쉬움 검색 성능이 좋음(index를 이용한 무작위 접근 가능) 참조를 위한 추가 메모리 할당이 없음 |
데이터 저장/검색 속도가 빠름 key 중복여부 확인이 쉬움 |
단점 | 자료 삽입/삭제 시 비효율적(다음 항목의 모든 요소를 이동시켜야 함) 한번 지정한 크기를 바꿀 수 없음 메모리 재사용이 불가능 |
일반적으로 저장공간이 비교적 많이 필요함 여리 key의 주소가 동일할 경우, 충돌 해결을 위한 자료구조가 필요함 |
시간복잡도 | 일반: O(1) 최악: O(n) |
일반: O(1) 최악: O(n) |
2. 예시
- 프로그래머스 - '완주하지 못한 선수' 문제
- [알고리즘] 해시 - Lv.1 완주하지 못한 선수
종류 | 설명 및 예시 |
get() | - 딕셔너리에 주어진 key 값을 반환하는 메서드 - 주어진 key가 딕셔너리에 존재하면 key 값 반환 / 없으면 기본값(미지정 시 None) 반환 - dict = {'a': 1, 'b': 2}라는 딕셔너리가 있고, value = dict.get('a')를 한다면 1 출력 - value = dict.get('c', 'N/A')를 한다면 N/A 출력 |
3. Hash를 쓰는 조건
- String을 기반으로 정보를 기록 & 관리해야 할 때는 단순 배열을 쓸 수 없으니 Hash를 활용하자!
- 프로그래머스 - 완주하지 못한 선수
- '선수 이름'(String) → 완주 여부 판단
- 프로그래머스 - 신고 결과 받기
- 게시판 사용자 중 신고 당한 사람을 기준으로 신고자 목록 관리
- 신고 당한 사람의 '이름'(String)
- 프로그래머스 - 위장
- 옷의 종류에 따라 몇 개의 옵션이 있는지 카운트 해야 함
- 옷의 종류가 정수가 아니라 '얼굴', '상의', '하의', '겉옷'(String)
4. 정리
- Hash는 전화번호부와 같다
- 대부분 그 Key가 String임
참고 영상: 개발자로 취직하기 - 해시 Hash 알고리즘 설명 5분만에 이해하기
https://youtu.be/zFL29ydL9D8?si=VFqkQ1EYd5Y43fVn
반응형
'Java > 알고리즘' 카테고리의 다른 글
[알고리즘/덱(Deque)] 스택, 큐, 덱 - 개념, Python 주요 문법, deque 객체 지원 메소드 (0) | 2024.08.16 |
---|---|
[알고리즘/그리디] 각 상황에서 최적인 방법 선택, 예시 문제(거스름돈, 1이 될 때까지, 곱하기 혹은 더하기, 모험가 길드) (1) | 2024.08.16 |
[알고리즘] 해시 - Lv.2 전화번호 목록 (0) | 2024.06.13 |
[알고리즘] 해시 - Lv.1 완주하지 못한 선수 (0) | 2024.06.10 |
[알고리즘] 해시 - Lv.1 폰켓몬 (0) | 2024.05.23 |