본문 바로가기
JavaScript/기초 및 알고리즘 함수

자바스크립트 에서 set 으로 중복 제거가 안될때

by tokkiC 2022. 8. 30.
inp.shift();
  let inparr = [];
  inp.forEach((el) => {
    let temp = [];
    for (ch of el) {
      temp.push(ch);
      temp.sort();
      temp.join("");
      inparr.push(temp);
    }
  });
  console.log(inparr);
  let set = new Set(inparr);
  let set = new Set([...inparr].map((x) => JSON.stringify(x)));
  console.log(set);

자바스크립트를 이용해 코딩테스트를 풀던 도중 중복을 제거하기 위해서

Set 객체를 사용하던 중에 중복 제거가 안됐다 // inparr.push(temp)를 for밖으로 안뺀 바보짓이 원흉...

입력 예시중 하나로 아래와 같이 주어졌을때

2
a
a

중복된 a 를 제거하기 위해서

Set 객체에 a 를 집어 넣었는데 엥 set 에 1개가 아니라 2개가 들어간 것이 아닌가!

inp.shift();
  let inparr = [];
  inp.forEach((el) => {
    let temp = [];
    for (ch of el) {
      temp.push(ch);
      temp.sort();
      temp.join("");
      inparr.push(temp);
    }
  });
  let set = new Set(inparr);
  console.log(set);
  
  // Set(2) { [ 'a' ], [ 'a' ] }

중복 제거에 set 맞는데... 왜지

set 에 넣은 inparr 를 확인해보자

inp.shift();
  let inparr = [];
  inp.forEach((el) => {
    let temp = [];
    for (ch of el) {
      temp.push(ch);
      temp.sort();
      temp.join("");
      inparr.push(temp);
    }
  });
  console.log(inparr);
  
  // [ [ 'a' ], [ 'a' ] ]

inparr 배열의 요소도 배열인 것을 알 수 있다. 아하!

중복이 제거되지 않은 이유는 Set 객체 내의 요소가 값이 아니라 각각 배열이라는 객체로 들어갔기 때문이다!

아아아 근데 풀이 자체가 개판이었어!

각각의 객체는 참조 주소가 다르므로 중복으로 처리가 안된 것!

set 의 각 요소가 객체가 아니라 값으로 들어갔다면 제거가 됐을것이다

그러니 자바스크립트의 ... 세개의 점으로 표현하는 구조 분해를 이용해서 배열을 벗겨서 아래와 같이 set에 넣어주면

inp.shift();
  let inparr = [];
  inp.forEach((el) => {
    let temp = [];
    for (ch of el) {
      temp.push(ch);
      temp.sort();
      temp.join("");
      inparr.push(temp);
    }
  });
  let set = new Set(...inparr);  // 구조분해할당 ... 
  console.log(set);
  
  // Set(1) { 'a' }

짜잔! 제대로 중복이 제거가 된 것을 알 수 있다

구조분해할당 외의 방법으로는 JSON.stringify()  를 사용하는 방법이 있는데

inp.shift();
  let inparr = [];
  inp.forEach((el) => {
    let temp = [];
    for (ch of el) {
      temp.push(ch);
      temp.sort();
      temp.join("");
      inparr.push(temp);
    }
  });
  console.log(inparr);
  let set = new Set([...inparr].map((x) => JSON.stringify(x)));
  console.log(set);
  
  
// Set(1) { '["a"]' }

마찬가지로 중복이 제거된 것을 확인 가능하다

위의 경우는 배열 요소를 JSON 형식의 문자열로 변환하는 함수를 사용하여 문자열인 값으로 변환한 것이므로

중복이 제거된 것이다 아하!

사실 inparr.push(temp)를 for문 밖으로 빼야 될 것을 놓쳐서 위와 같은 문제가 생겼던 것이었다

배운것을 많았지만 코드는 아래처럼 수정하자

inp.shift();
  let inparr = [];
  inp.forEach((el) => {
    let temp = [];
    for (ch of el) {
      temp.push(ch);
      temp.sort();
    }
    inparr.push(temp.join(""));
  });
  let set = new Set(inparr);
  console.log(set);

댓글