Algorithm

Study - Set

Sila 2023. 8. 17. 13:14

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