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

JunSung Choi·2021년 2월 27일
0

알고리즘

목록 보기
20/20
post-thumbnail

문제 링크 : 두 개 뽑아서 더하기

문제 설명

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

제한사항

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

입출력 예

입출력 예 설명

입출력 예 #1

2 = 1 + 1 입니다. (1이 numbers에 두 개 있습니다.)
3 = 2 + 1 입니다.
4 = 1 + 3 입니다.
5 = 1 + 4 = 2 + 3 입니다.
6 = 2 + 4 입니다.
7 = 3 + 4 입니다.
따라서 [2,3,4,5,6,7] 을 return 해야 합니다.

입출력 예 #2

2 = 0 + 2 입니다.
5 = 5 + 0 입니다.
7 = 0 + 7 = 5 + 2 입니다.
9 = 2 + 7 입니다.
12 = 5 + 7 입니다.
따라서 [2,5,7,9,12] 를 return 해야 합니다.

Solution

두 개 뽑는다 라는 말을 봤을 때 '아 이건 몇개 중 몇개 뽑는 조합 문제겠구나' 하고 생각했다.
예전에 배웠던 알고리즘에서의 조합 문제를 고민해보니 조합은 재귀로 풀었던 기억이 떠올랐다.
이전에 알고리즘을 처음 시작했을때는 이런 문제를 보면 보통 for문을 두번 반복하며 i, j 를 타는동안 검사하여 합을 구했을텐데... 재귀 이론을 알아두면 알고리즘에서는 굉장히 유용한 것 같다.
아이템 뽑아 selected 배열에 넣어준다. 그런 후 바로 재귀로 다시 한번 함수를 타는데 그때 전달하는 함수의 인자가 중요하다. + 1 한 count와, numbers 배열, 방금 selected에 넣었던 배열의 index를 +1 해서 전달해준다. index에 +1 을 해줘야 같은 인덱스의 아이템을 넣지 않고 다음 인덱스의 아이템을 넣을 수 있다.
나는 재귀의 기저조건(빠져나올 조건) 을 count 가 2일 경우로 만들어 두었다. 2개만 뽑는댔으니 count가 2이면 selected 배열에 넣어놓았던 아이템들을 모두 더해서 다시 result 배열에 넣어둔다.

const COUNT = 2
const selected = []
const result = []

function recursive(count, numbers, index) {
    if (count === COUNT) {
        return result.push(selected.reduce((prev, current) => prev + current))
    }
    for (let i = index; i < numbers.length; i++) {
        selected.push(numbers[i])
        recursive(count + 1, numbers, i + 1)
        selected.pop()
    }
}

function solution(numbers) {
    recursive(0, numbers, 0)
    return [...new Set(result)].sort((a, b) => a - b)
}
profile
Frontend Developer

0개의 댓글