Hash Table은 어떠한 값을 받으면 그 값을 해시 함수
에 통과시켜 나온 인덱스에 저장하는 자료구조이다.
쉽게 요약하자면,
Hash Table
키 : 값
으로 이루어진 자료구조
라고 설명할 수 있다.
이러한 특징으로 인해, JavaScript에서는 Hash Table을 사용해서 문제를 풀 때, 주로 Map
, Object
를 사용한다.
알고리즘 문제에서는 대부분 해시 문제가 나왔을 때, 배열 형태로 파라미터를 받아 문제를 풀어야 한다.
const fruitsName = ['Apple', 'Orange', 'Grapefruit'];
const fruitsPrice = [2000, 4000, 3000];
과일의 이름이 담긴 배열과 과일의 가격이 담긴 배열이 있다고 하자.
Map객체는 간단한 키와 값을 서로 연결(매핑)시켜 저장하며 저장된 순서대로 각 요소들을 반복적으로 접근할 수 있도록 한다.
Map 객체에 키:값을 추가하려면 fruits.set(키, 값);
을 사용하고,
키를 통해 값을 찾고 싶으면, fruits.get(키)
를 사용한다.
위에서의 과일 이름을 키
로 하고, 과일 가격을 값
이라고 한다면,
// Map 객체 생성
const fruits = new Map();
// forEach 메서드를 통해 Map에 `키 : 값`을 추가
fruitsName.forEach((name,i)=>fruits.set(name,fruitsPrice[i]))
console.log(fruits)
콘솔 창 출력 결과는 다음과 같다.
Map(3) {"Apple" => 2000, "Orange" => 4000, "Grapefruit" => 3000}
(Set을 통해서도 Map처럼 키:값을 저장할 수 있지만, set은 중복된 값을 허용하지 않는다는 특징이 존재한다.)
객체는 중괄호 내부에 key: value모양으로 값을 가질 수 있다.
- Map과의 차이점이라면,
Object
는 String과 Symbol type만 키로 가능한 반면에,
Map
은 모든 값을 키로써 가질 수 있다는 점이다.
앞서서의 Map과 마찬가지로 Object로도 동일한 작업을 해보겠다.
const fruits = {};
fruitsName.forEach((name,i)=>fruits[name]=fruitsPrice[i])
console.log(fruits)
콘솔 창 출력 결과는 다음과 같다.
{Apple: 2000, Orange: 4000, Grapefruit: 3000}
Object
의 키는 Strings이며, Map
의 키는 모든 값을 가질 수 있다.Object
는 크기를 수동으로 추적해야하지만, Map
은 크기를 쉽게 얻을 수 있다.실행 시까지 키를 알수 없고, 모든 키가 동일한 type이며 모든 값들이 동일한 type일 경우에는 objects를 대신해서 map을 사용해라.
각 개별 요소에 대해 적용해야 하는 로직이 있을 경우에는 objects를 사용해라.
포스트 작성할 때 참고한 사이트: