Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- REST_API
- html
- redux
- UX
- 자바스크립트
- 자료구조
- vercel
- 코드스테이츠
- level1
- UI
- web
- mysemester
- Next.js
- CSS
- React
- superstarjypnation
- 생활코딩
- 프로토타입
- 백준
- useState
- 스택
- 30daysdowoonchallenge
- 회고
- 카카오
- 큐
- javascript
- Til
- 프로그래머스
- 해시테이블
- 운영체제
Archives
- Today
- Total
데굴데굴
TIL: 2023-05-08 본문
⚙️ 오늘 학습한 내용
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