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 에 넣은 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);
'JavaScript > 기초 및 알고리즘 함수' 카테고리의 다른 글
[JS] 큰 수의 사용 시 BigInt 로 형변환 (0) | 2022.08.14 |
---|---|
filter 함수 사용법 (0) | 2022.08.12 |
빈 문자열을 split 하면 빈 문자열이 담긴 배열을 리턴한다 (0) | 2022.08.12 |
split 으로 나눌때 공백이 두 개 이상일 경우 (0) | 2022.08.12 |
[JS] for in , for of 차이 (0) | 2022.08.10 |
댓글