Set
es6에 추가된 `고유한 값`들의 집합을 다루는 자료 구조이다.
즉, map과 마찬가지로 중복을 허용하지 않고,
순서가 없이 (배열에서 사용하는 idx가 없음) data를 저장한다.
1. Set 생성
map과 마찬가지로 `new` keyword를 이용해 생성한다.
초기값을 주지 않으면 빈 set이 만들어진다.
const emptySet = new Set()
console.log(emptySet) // Set(0) {}
배열을 인자로 주면 배열에 담긴 값으로 set을 만들 수 있다. (중복된 값은 제거됨)
const numSet = new Set([1, 2, 3])
console.log(numSet) // Set(3) { 1, 2, 3 }
2. methods
- Set에 값을 추가, 제거 할 때는 각각 add(), delete() method를 사용한다.
const testSet1 = new Set()
// .add() method에 추가할 값을 인수로 넣어주면 해당 값이 set에 추가된다.
// 이미 있는 경우 추가되지 않는다.
testSet1.add(1).add(true).add(2)
console.log(testSet1) // Set(3) { 1, true, 2 }
// .delete() method에 set에서 삭제하고 싶은 값을 인수로 넣어주면
// 해당 값이 set에서 제거된다.
testSet1.delete(1)
console.log(teseSet1) // Set(2) { true, 2 }
- Set의 모든 값들을 제거하고 싶다면 .clear() method를 사용한다.
testSet1.clear()
console.log(testSet1) // Set(0) { }
- 값의 존재 여부를 확인하기 위해서는 .has() method를 사용한다.
const testSet2 = new Set([1, 2, 4])
console.log(testSet2.has(2)) // true
console.log(testSet2.has(3)) // false
- Set 내부에 존재하는 원소 갯수를 확인하기 위해서는 .size 속성을 확인한다.
(map과 마찬가지로 method가 아닌 attribute)
console.log(testSet2.size) // 3
3. 순회
map과 마찬가지로 for - of 문을 사용한다.
(map, set 둘 모두 기본적으로 obj이므로 obj의 요소를 순회하는 신텍스를 사용하면 된다.)
const testSet3 = new Set([1, 2, 3, 4])
for (const num of testSet3) {
console.log(num)
}
// 1
// 2
// 3
// 4
4. arr과의 상호변환
arr과 set은 상호 변환이 가능하다.
set은 중복을 허용하지 않는다는 점을 이용해 arr에서 간단하게 중복된 요소를 제거할 때도 활용할 수 있다.
const testArr = ["a", "b", "c", "c"]
// Set으로 바꾸는 과정에서 중복값은 제거 됨
const testSet4 = new Set(testArr)
console.log(testSet4) // Set(3) { 'a', 'b', 'c' }
testSet4를 다시 배열로 변환하는 방법은 다음과 같다.
const testArr2 = [...testSet4]
console.log(testArr2) // [ "a", "b", "c" ]
// 혹은 다음과 같이 써도 동일하다.
const testArr3 = Array.from(testSet4)
console.log(testArr3) // [ "a", "b", "c" ]
이를 잘 활용하면 간단하게 배열의 중복값을 제거한 새 배열을 만들 수 있다. (arr > set > arr)
반복문, include문 이제 더 이상은 naver..
const numbers = [1,2,2,3,3,4,4,5,6,7]
const unique = [...new Set(numbers)]
console.log(unique) // [1,2,...,7]
5. 활용
Set의 성질을 잘 이용해 두 배열의 교집합, 차집합, 합집합도 구할 수 있다.
const set1 = new Set([1,2,3,4,5])
const set2 = new Set([4,5,6,7,8])
1. 합집합
const union = new Set([...set1, ...set2])
2. 교집합
const intersection = new Set([...set1].filter((v) => set2.has(v)))
3. 차집합
const diff = new Set([...set1].filter((v) => !set2.has(v)))
'Algorithm' 카테고리의 다른 글
[nodejs] for (0) | 2023.08.22 |
---|---|
Study - Array vs. Map/Set (0) | 2023.08.17 |
Study - Map (0) | 2023.08.17 |
백준 10815 (nodejs) (0) | 2023.08.17 |
Intro (0) | 2023.08.17 |