데굴데굴

TIL: 2023-05-08 본문

Lesson/TIL

TIL: 2023-05-08

aemaaeng 2023. 5. 8. 22:10

⚙️ 오늘 학습한 내용

Set

🗝 키워드

Set

🗣 스스로에게 설명

Set은 ECMAScript 2015(ES6)에서 도입되었다.
오늘 면접에서 관련 질문이 나왔는데 필요할 때 갖다쓰기만한 정도라 제대로 대답을 못해서 정리해보았다.
'모던 자바스크립트 딥다이브'를 참고했다.

Set

중복되지 않는 유일한 값들의 집합, 수학적 집합을 구현하기 위한 자료구조

배열과 유사하지만 몇몇 차이가 있다.

  • 값 중복 불가
  • 순서에 의미가 없음
  • 인덱스로 접근 불가

Set 생성

const set1 = new Set([1, 2, 3, 3]);
console.log(set1); // Set(3) {1, 2, 3}

const set2 = new Set('world');
console.log(set2); // Set(5) {'w', 'o', 'r', 'l', 'd'}

const set3 = new Set('hello');
console.log(set3); // Set(3) {'h', 'e', 'l', 'o'}

Set의 인수로 문자열을 전달하면 중복된 문자는 제거하여 하나씩 쪼개진 문자열 집합을 만든다.

// 스프레드 문법 사용 가능
const unique = (arr) => [...new Set([1, 2, 2, 3, 4, 5])];
console.log(unique) // {1, 2, 3, 4, 5}

사이즈 확인

const set = new Set([1, 2, 3]);
console.log(set.size) // 3

요소 추가
Set.prototype.add로 set에 요소를 직접 추가할 수 있다.
연속 호출도 가능하다.
객체나 배열과 같은 자바스크립트의 모든 값을 저장할 수 있다.

const set = new Set();
console.log(set);

set.add(1).add(2);
console.log(set); // Set(2) {1, 2}

요소 존재 여부 확인
Set.prototype.has로 요소의 존재 여부를 확인할 수 있다. 불리언값을 리턴한다.
(시간복잡도 찾아보기)

const set = new Set([1, 2, 3]);

console.log(set.has(2)); // true
console.log(set.has(4)); // false

삭제, 일괄 삭제

const set = new Set([1, 2, 3]);
set.delete(2); // 요소 2가 지워진다.
set.delete(1); // 요소 1이 지워진다.

존재하지 않는 값을 지우려고 하면 에러가 발생하지 않고 그냥 무시된다.
add와 달리 연속 호출이 불가능하다.

const set = new Set([1, 2, 3]);
set.clear();
console.log(set); // Set(0) {}

요소 순회
Set.prototype.foreach로 set 내부의 요소를 순회할 수 있다.
Set 객체는 이터러블이기 때문에 for...of문으로도 순회할 수 있고, 스프레드 문법이나 비구조화 할당도 쓸 수 있다.

const set = new Set([1, 2, 3]);
console.log([...set]); // [1, 2, 3];
for (let val of set) {
  console.log(val); // 1 2 3
}
const [a, ...rest] = set;
console.log(a, rest); // 1, [2, 3]

집합 연산
Set으로 교집합, 합집합, 차집합 등을 구현할 수 있다

교집합

Set.prototype.intersection = function (set) {
  const result = new Set();
  for (let value of set) {
    if (this.has(value)) result.add(value);
  }
  return result;
};

const setA = new Set([1, 2, 3, 4]);
const setB = new Set([2, 4]);

// setA와 setB의 교집합
console.log(setA.intersection(setB)); // Set(2) {2, 4}

합집합

Set.prototype.union = function (set) {
  return new Set([...this], [...set]);
};

const setA = new Set([1, 2, 3, 4]);
const setB = new Set([2, 4]);

// setA와 setB의 합집합
console.log(setA.union(setB)) // Set(4) {1, 2, 3, 4}

차집합

Set.prototype.difference = function (set) {
  const result = new Set(this);
  for (let value of set) {
    result.delete(value);
  }
  return result;
}

const setA = new Set([1, 2, 3, 4]);
const setB = new Set([2, 4]);

// setA에 대한 setB의 차집합 (setA에만 존재하는 값 리턴)
console.log(setA.difference(setB)) // Set(2) {1, 3}

부분집합, 상위 집합 (불리언 리턴)

// 상위 집합
Set.prototype.isSuperset = function (subset) {
  // 부분집합을 기준으로 this에 값이 전부 존재하는지 확인
  for (let value of subset) {
    if (!this.has(value)) return false;
  }
  return true;
}

const setA = new Set([1, 2, 3, 4]);
const setB = new Set([2, 4]);

console.log(setA.isSuperset(setB)); // true
console.log(setB.isSuperset(setA)); // false

🔎 공부가 더 필요한 부분

Set.prototype.has의 시간복잡도

'Lesson > TIL' 카테고리의 다른 글

TIL: 2023-06-05  (0) 2023.06.05
TIL: 2023-05-11  (0) 2023.05.11
TIL: 2023-05-06  (0) 2023.05.06
TIL: 2023-05-05  (0) 2023.05.05
TIL: 2023-05-04  (0) 2023.05.04
Comments