꽤 자주 등장하는 자료구조 질문이다.
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 으로 데이터 중복제거 처리를 한 뒤에 리스트로 변환한 뒤 정렬을 해주는 방식으로 가야한다.
'프로그래밍 > 자료구조' 카테고리의 다른 글
[자료구조] # 3. HashMap vs HashTable (0) | 2024.07.18 |
---|---|
[자료구조] # 1. 배열(Array)과 리스트(List)의 차이 (0) | 2024.07.14 |
[자료구조] # 0. 언제 스택을 쓰고, 큐를 써야할까? (0) | 2024.07.03 |