본문 바로가기
프로그래밍/자료구조

[자료구조] # 2. Set vs Map

by Crush on Study 2024. 7. 17.
반응형

꽤 자주 등장하는 자료구조 질문이다.

Set이 뭐고 Map이 무엇인가?

 

일단 파이썬에서의 Map과 Java 또는 JS에서의 Map은 다르다.

파이썬에서의 Map은 보통 아래처럼 사용하는데

arr = list(map(int,input().split()))

입력을 받을 때, 모두 int형태로 통일받겠다는 뜻이다. 단순히 각 요소에 타입이나 함수를 적용하는 식!

 

JS에서는

// 생성
let map = new Map();

// 세팅
map.set('key1', 'value1');
map.set('key2', 'value2');
map.set(3, 'value3'); // 숫자 키
map.set({a: 1}, 'value4'); // 객체 키

// 접근
console.log(map.get('key1')); // 'value1'
console.log(map.get(3)); // 'value3'

// 삭제
map.delete('key2'); // key2 삭제

// 값 확인 (존재 여부)
console.log(map.has('key1')); // true
console.log(map.has('key2')); // false

 

이렇게 키-값 쌍으로 입력을 받는다. 파이썬으로치면 딕셔너리와 기능이 거의 유사하다.

입력받은 키대로 순서가 유지되는 것도 그렇다.

 

이외에도 위 내용과 함께 한문장 단위로 정리하자면

1) 키-값 형태로 저장이 되며, 인덱스 접근을 통해 검색이 빠르다

2) 키를 넣은 순서 그대로 유지가 된다.

3) 다양한 자료형의 값을 넣을 수 있다.

4) 중복된 값을 허용한다. (키는 중복되어선 안된다)

 

이 상태다.

그러면 Set은 뭘까? Set은 집합의 개념인데 Map과 가장 큰 차이를 2개 말하자면 

a) 중복된 값이 허용되지 않는다.  b) 순서가 보장되지 않는다.  이 2개다.

 

일단 a번.

let set = new Set();

// 값 추가
set.add(1);
set.add(2);
set.add(3);
set.add(2); // 중복된 값은 무시됨

// 값 존재 여부 확인
console.log(set.has(1)); // true
console.log(set.has(4)); // false

// Set 크기 확인
console.log(set.size); // 3

// 모든 값 순회
set.forEach(value => {
  console.log(value);
});
// 출력:
// 1
// 2
// 3

// 또는
for (let value of set) {
  console.log(value);
}
// 출력:
// 1
// 2
// 3

 

위 코드를 돌려보면 1,2,3,2를 넣었던게 1,2,3까지만 나온다.

고유성을 보장한다는 특징 때문에 데이터 저장에 효율적인데 보통 방문한 페이지의 URL을 저장할 때가 이러하다. 

naver를 여러번 들어가도 URL은 하나로 저장되고 n 누르면 바로 쿠키에 담겨진게 나오듯!

 

b번. 순서가 보장되지 않는다.

즉, Set 자체는 sort가 되지 않는다. 파이썬도 그렇고 JS도 그렇다.

코테 풀다보면 한번 시도해봤겠지만, Set 으로 데이터 중복제거 처리를 한 뒤에 리스트로 변환한 뒤 정렬을 해주는 방식으로 가야한다.

 

 

반응형