정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.
numbers | result |
---|---|
[2,1,3,4,1] | [2,3,4,5,6,7] |
[5,0,2,7] | [2,5,7,9,12] |
function solution(numbers) {
// 중첩 for문 돌려서 모든 덧셈 결과값 저장하고 set처리
let sumArr = [];
for (let i=0; i<numbers.length; i++) {
for (let j=i+1; j<numbers.length; j++) {
sumArr.push(numbers[i]+numbers[j])
}
}
const set = new Set(sumArr);
return Array.from(set).sort((a,b)=>a-b);
}
중첩 for문으로 인덱스에서 두개씩 뽑았을 때의 합을 모두 answer에 저장하였는데, 중복이 없어야 하므로 Set을 가져와서 사용했다. set으로 만들어서 중복을 제거 한뒤 Array.from()
을 사용하여 다시 Set을 배열로 만들어 준 뒤 sort()로 오름 차순 정렬을 하였다.
다만, 저렇게 새로운 set을 만들고 다시 Array로 바꿔주는 처리 없이
return [...new Set(sumArr)].sort((a, b) => a - b);
전개구문연산자를 사용해서 한 줄로 줄일 수 있는 방법을 알아둬야겠다.
Set
는 자바스크립트에서 고유한 값들의 집합을 다루는 자료구조이다. 한마디로 순서가 없는 중복되지 않은 데이터의 집합인데 배열(array)과 차이점을 이해하는 것이 무엇보다 중요하다.
배열은 데이터를 순서있게 저장한다. 그래서 인덱스(index)를 통해서 특정 위치에 저장되어 있는 데이터에 접근이 가능하다. 그리고 배열에는 동일한 값을 여러 번 저장할 수 있다. 값이 동일하더라도 인덱스가 틀리기 때문에 데이터의 중복이 문제되지 않는다.
반면에 Set
는 얼핏 보기에는 배열과 비슷해보일 수 있지만 사실 결이 아주 다른 자료구조이다. 우선 Set
는 데이터를 순서없이 저장한다. 따라서 배열처럼 인덱스를 통해서 접근할 수가 없다. 그리고 Set
는 중복된 데이터를 허용하지 않는다. 즉, 기존 Set
에 있는 값을 또 추가하면 아무 효력이 발생하지 않는다.
배열을 Set
로 변환
기존에 존재하는 배열로 부터 새로운 Set
를 만들어어야 할 경우, Set() 생성자의 인자로 해당 배열이 할당된 변수를 넘기면 된다.
const array = [1, 2, 2, 3, 3, 3];
const set = new Set(array); // Set(3) {1, 2, 3}
여기서 중요한 부분은 이렇게 배열로부터 Set
를 만들어내면 중복 값이 모두 제거된다는 것이다.
Set
를 배열로 변환
가장 쉬운 방법은 대괄호 안에서 Set
를 상대로 전개(spread) 연산자를 사용하는 것이다.
const array = [...set]; // [1, 2, 3]
다른 방법으로는 Array.from()
함수를 사용하는 방법도 있다.
const array = Array.from(set); // [1, 2, 3]
배열에서 중복 값 제거
Set
는 중복 값을 허용하지 않기 때문에, 배열이나 문자열에서 중복된 값을 제거하는 데에 매우 유용하게 활용될 수 있다.
const numbers = [1, 2, 2, 3, 4, 4, 5];
const uniqueNumbers = [...new Set(numbers)];
console.log(uniqueNumbers); // [1, 2, 3, 4, 5]