본문 바로가기

JS, TS

[Javascript] Map & Set 객체 살펴보기

반응형

1. Map & Set 소개

1-1. Map ?

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

 

Map - JavaScript | MDN

The Map object holds key-value pairs and remembers the original insertion order of the keys. Any value (both objects and primitive values) may be used as either a key or a value.

developer.mozilla.org

 

Map 객체는 key - value 로 이루어지며, 키의 삽입 순서를 기억한다
또한, 어느 값(any value)이든 key - value 값으로 사용할 수 있다

 

key - value 형태가 기본적으로 Object 객체와 비슷한 형태이지만,

위와 같은 특성을 가진 객체를 Map 으로 정의한다

 

이는 다음 상황일 때 사용을 고려할 수 있다고 한다

  1. key값에 문자열이 아닌 어느 값이든 넣을 수 있다
  2. 객체의 size를 알아야 할 경우나
    객체의 값을 자주 변경하고 존재유무 및 특정 key의 index를 판단하는 일이 잦을 때

 

1-2. Set ?

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Set

 

Set - JavaScript | MDN

Set 객체는 자료형에 관계 없이 원시 값과 객체 참조 모두 유일한 값을 저장할 수 있습니다.

developer.mozilla.org

 

Set 객체는 값 콜렉션으로, 삽입 순서를 기억한다
하나의 Set 내 값은 중복 없이 유일하다

 

값이 중복 없이 유일하다는 특징으로, 활용성이 굉장히 높아보인다

 

해시테이블을 사용하는 Set의 경우에, has 메서드의 시간복잡도가 O(1) 이고

배열의 includes 메소드는 선형탐색으로 O(N) 이다

따라서 존재유무 및 중복 제거를 확인한다면, Set 사용을 고려할 수 있다

 

또한 다음과 같이 쉽게 배열과 변환할 수 있다

 

const myArr = [1, 2, 3];
const mySet = new Set(myArr);
console.log([...mySet]); // [1, 2, 3]

 

2. Map & Set 메소드

  • set(key, value) :: Map / add(key) :: Set
  • get(key)
  • delete(key)
  • has(key)
  • clear()
  • size
  • keys()
  • values()
  • entries()
  • ...등

 

아래는 Map 객체와 배열 객체의 관계를 나타낸 예시 코드이다

 

const kvArray = [['key1', 'value1'], ['key2', 'value2']]
const myMap = new Map(kvArray)

myMap.get('key1') // "value1"

 

아래는 Set 객체로 반복문을 돌리는 예시 코드이다

 

// set 내 항목에 대해 반복
// 순서대로 항목을 (콘솔에) 기록: 1, "some text", {"a": 1, "b": 2}
for (let item of mySet) console.log(item);

// 순서대로 항목을 기록: 1, "some text", {"a": 1, "b": 2}
// (여기서 key와 value는 같음)
for (let [key, value] of mySet.entries()) console.log(key);

// 차집합은 다음으로 흉내낼 수 있음
const difference = new Set([...set1].filter(x => !set2.has(x)));

 


3. Map & Set 활용 문제

다음 문제는 시간초과를 해결하기 위해, Map & Set 을 연습하기에 좋은 문제이다

중복을 없애야 하고, indexing 을 해야 한다

그 과정에서 indexOf 와 같은 배열 메소드를 사용하면 시간초과가 난다

 

https://www.acmicpc.net/problem/18870

 

18870번: 좌표 압축

수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌

www.acmicpc.net

반응형