[프로그래머스 Lv1] 두 개 뽑아서 더하기 - (Javascript)

eeeyooon·2023년 12월 27일
0

두 개 뽑아서 더하기

문제 링크

📩 문제 설명

정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.

제한 사항

  • numbers의 길이는 2 이상 100 이하입니다.
    • numbers의 모든 수는 0 이상 100 이하입니다.

입출력 예제

numbersresult
[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에 대해서

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]

0개의 댓글