[JavaScript] Set 객체

김재미·2021년 7월 28일

Set 객체는 자료형에 상관없이 유일한 값을 저장할 수 있습니다.

Set 객체는 ES2015 문법 이후 JavaScript 내장객체로 포함되어 사용가능합니다.
각종 배열과 관련된 문제를 해결할 때 Set객체를 활용하면 보다 간결하게 코드를 작성할 수 있습니다.

1. 기본 사용방법

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

set.has(1) // true
set.has(6) // false

set.add(7); // 추가
set.add(7); // 동일값이 있기 때문에 추가 되지 않습니다.
set.size // 6

set.delete(5);
set.has(5); // false

// set 내 모든 항목 조회
for (let item of set) console.log (item);

// 아래와 같이 사용가능
for (let item of set.keys()) console.log (item);
for (let item of set.values()) console.log (item);
for (let [key,value] of set.entries()) console.log(value);

2. Set과 Array 사이 변환

myset = new Set([1,2,3,4,]);

let arr = [...set]; // [1,2,3,4]

3. 교집합, 차집합

let set1 = new Set([1,2,3,4]);
let set2 = new Set([3,4,5,6]);

// 교집합
var intersection = new Set([...set1].filter( x => set2.has(x))); //3,4

// 차집합
var difference = new Set([...set1].filter( x => !set2.has(x))); // 1,2 
var difference2 = new Set([...set2].filter( x => !set1.has(x))); // 5,6

4. prototype으로 기본 집합 연산구현

완전 포함관계 여부 조회

Set.prototype.isSuperset = function(subset) {
  for (let elem of subset) {
    // 포함되지 않은 항목이 하나라도 있을 경우 포함관계가 아니다
    if (!this.has(elem)) return false;
  }
  return true;
}

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

setA.isSuperset(setB); // false
setA.isSuperset(setC); // true

합집합 만들기

Set.prototype.union = function(setB) {
  let union = new Set(this);
  for (let elem of setB) union.add(elem);
  
  return union;
}

const setA = new Set([1,2,3,4]);
setA.union(new Set([1,2,4,5])); // [1,2,3,4,5]

교집합 만들기

// 교집합
Set.prototype.intersection = function(setB) {
  let intersection = new Set();
  for (let elem of setB) {
    //기존 객체에 존재할 경우 intersection 객체에 추가한다.
    if (this.has(elem)) intersection.add(elem);
  }
  return intersection;
}

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

setA.intersection(setB); //2,3

차집합 만들기


// 차집합
Set.prototype.difference = function(setB) {
  let difference = new Set(this);
  // 원 객체에서 동일한 키 값을 삭제하여 다른 값만 남도록
  for (let elem of setB) {
    difference.delete(elem);
  }
  
  return difference;
}

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

setA.difference(setB); //1,4

예제_중복된 값 제거

// 무작위로 입력 받은 값들중 최대 값을 출력하시오. 
// 값은 배열로 제공되며 중복된 값이 존재합니다.
// input : [1,1,1,2,3,11,3,4,5,3,4] , output : 11
const input = [1,1,1,2,3,11,3,4,5,3,4];
const set = [...new Set(input)]; // Set 객체를 사용하여 중복 값 제거

let maxVal = -1;
set.forEach(value => {
  if (maxVal<value) maxVal = value;
});

예제_Map과 Set비교


// 문제 : 중복된 항목의 배열이 주어진다. 고유한 값을 가진 항목의 수를 구하시오 
// input : [1,1,2,3,4,4,5,1], output : [1,2,3,4,5] => 5개

//Map
function solution(nums) {
    var answer = 0;
    let map = new Map();
    
    for (let i =0; i < nums.length; i++) {
        if (!map.has(nums[i])) answer++;
        map.set(nums[i]);
    }
    
    return answer;
}

//Set을 사용할 경우 2줄!!
function solution(nums) {
    
  const set = new Set([...nums]);
  return set.size;
}
profile
아직은 자기소개가 어려워요

0개의 댓글