[Algorithm] 자바스크립트 세트(Set)

현채은·2023년 9월 11일
post-thumbnail

오늘 알고리즘 문제를 풀이하면서 알았으면 좋았을 법 한 내용이 있어서 블로그에 기록해두려고 한다 !

Set 자료구조

  • set : 순서가 없는 중복되지 않은 데이터의 집합
  • Array vs Set
    • Array
      • 배열은 데이터의 순서가 존재하기 때문에 index를 통해 특정 위치에 저장되어 있는 데이터에 접근이 가능하다.
      • 배열은 동일한 값을 여러번 저장할 수 있으며, 값이 동일해도 인덱스는 다른 값을 가지기 때문에 데이터의 중복이 가능하다.
    • Set
      • 데이터의 순서없이 저장하는 방식
      • 배열처럼 인덱스를 통한 접근이 불가능하다.
        ➡️ 중복된 데이터를 허용하지 않음
        ( 기존 세트에 있는 값을 추가하는 경우 기존 세트에는 변화가 없음 )

Set 생성

자바스크립트에서 Set은 클래스이므로 new 키워드와 생성자를 사용하여 객체를 생성할 수 있다.

const set = new Set() // set(0) {size:0}

위와 같이 생성자의 인자로 아무 값도 넣지 않으면 빈 세트가 생성된다.

다음은 배열을 인수로 넘기는 경우이다

const numSet = new Set([1,2,3]) // Set(3) {size:3}

값 추가

세트에 값을 추가하는 경우에는 add() 메서드를 사용한다.

set.add(1); // Set(1) {1}
set.add("Z") // Set(2) {1,'Z'}

추가적으로 add() 메서드는 값을 추가한 후에 세트를 반환하기 때문에 아래와 같이 연쇄적으로 호출할 수 있다.

set.add(1).add('Z')

값 삭제

Setdelete() 메서드를 사용하면 세트로 부터 특정 값을 삭제할 수 있다.

  • delete() 메서드에 인자로 넘기는 값이 세트에 존재하여 성공적으로 삭제한 경우 ➡️ true 반환
  • delete() 메서드에 인자로 넘기는 값이 세트에 존재하지 않아 삭제에 실패한 경우 ➡️ false 반환
set.delete(1); // true
set.delete(2); // false

값 존재 여부 확인

세트에 특정 값이 존재하는지 확인하려면 has() 메서드를 사용한다.

  • 보통 if 조건문이나 3항 연산자(ternary operator)와 자주 사용된다.
if(set.has(1)) {
  console.log("1은 Set에 존재합니다.")
}
const result = set.has("Z") ? true : false; // true

값의 개수 확인

세트의 size 속성을 통해서 해당 세트의 길이, 즉 얼마나 많은 값이 저장되어 있는지 알아낼 수 있다.

console.log(set.size) // 2

모든 값 제거

세트에 저장되어 있는 모든 값을 제거하려면 clear() 메서드를 사용한다.

set.clear() // set(0) {size:0}

세트 순회

세트에 저장되어 있는 모든 값을 순회하고 싶은 경우에는 for 루프문 안에서 of 연산자를 사용한다.

for (const num of numSet) {
  console.log(num); // 1, 'Z'
}

또한 배열처럼 forEach() 함수를 제공하고 있기 때문에 활용할 수 있다.

numSet.forEach((num) => console.log(num));

배열을 Set으로 변환

기존에 존재하는 배열로부터 새로운 Set을 만들어야 하는 경우에는 Set() 생성자의 인자로 해당 배열이 할당된 변수를 넘겨주면 된다.

const array = [1,2,2,3,3,3];
const set = new Set(array); // set(3) {1,2,3}

⭐️ 배열로부터 Set을 생성하면 중복값이 모두 제거된다 !

Set을 배열로 변환

대괄호 안에서 해당 Set을 상대로 전개(Spread) 연산자를 사용한다.

const array = [...set] ; // [1,2,3]

또 다른 방법으로는 Array.from() 함수를 사용하는 방법도 있다.

const array = Array.from(set); // [1,2,3]

배열에서 중복 값 제거

세트는 중복 값을 허용하지 않기 때문에, 배열이나 문자열에서 중복된 값을 제거하는 데에 매우 유용하게 활용될 수 있다.

const numbers = [1,2,2,3,4,4,5]
const uniqueNumbers = [...new Set(numbers)];
// set으로 중복 값을 제거한 뒤 다시 배열로 변환
console.log(uniquenumbers); [1,2,3,4,5]

TypeScript에서 Set 사용

타입스크립트를 사용하는 경우에는 세트를 생성할 때 저장할 수 있는 자료형을 제한할 수 있다.

예를 들어, 다음과 같이 세트를 생성할 때 숫자형의 데이터만 저장할 수 있도록 타입 인자를 명시해주면 다른 자료형의 데이터를 추가하려고 하는 경우 타입 에러가 발생한다.

const numSet = new Set<number>();
numSet.add(1);
numSet.add("A"); //Argument of type 'string' is not assignable to parameter of type 'number'.(2345)

📚 참고 문서

profile
개발 기록 공간

0개의 댓글