Open dlehdanakf opened 3 years ago
const DP = new Array(n + 1).fill(0);
1 부터 편하게 가기 위해 n+1
개 선언한다.1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
1 | 1 | 0 | 0 | 1 |
DP[2] += DP[1]
, DP[3] += DP[2]
, DP[4] += DP[3]
, DP[5] += DP[4]
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
1 | 2 | 1 | 1 | 2 |
DP[3] += DP[1]
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
1 | 2 | 2 | 3 | 4 |
DP[a] += DP[b]
형태의 식을 사용하여 문제를 해결해 나아가는데 a
와 b
의 관계는 b - a = n원짜리 동전
으로 볼 수 있다.function solution(n, money) {
const DP = new Array(n + 1).fill(0);
money.forEach(i => {
DP[i] += 1;
for(let j = i + 1; j <= n; j++) {
DP[j] += DP[j - i];
}
});
return DP[n];
}
n - 1
번째 계단에서 한 칸 올라왔거나, n - 2
번째 계단에서 두 칸 올라오는 방법이 있다.function solution(n) {
const DP = new Array(n + 1).fill(0);
const up = n => {
if(n === 1 || n === 0) return 1;
if(n < 0) return 0;
if(DP[n]) return DP[n];
return DP[n] = (up(n - 1) + up(n - 2)) % 1234567;
};
return up(n);
}
money
변수를 그대로 [1.2]
로 만들어 멀리뛰기 문제로 대입시켜도 문제를 해결할 수 없다.function solution(n) {
const jump = [1,2];
const DP = new Array(n + 1).fill(0);
const up = n => {
if(n === 1 || n === 0) return 1;
if(n < 0) return 0;
if(DP[n]) return DP[n];
return DP[n] = jump.reduce((acc, cur) => acc + up(n - cur), 0) % 1234567;
};
return up(n);
}
jump
배열로 넘어온다고 가정한다면 위와 같은 코드로 문제를 해결할 수 있다.function solution(n) {
if(n === 1) return 1;
const DP = new Array(n + 1).fill(0);
DP[0] = 0, DP[1] = 1;
for(let i = 2; i <= n; i++) {
DP[i] = (DP[i - 1] + DP[i - 2]) % 1234567;
}
return DP[n];
}
개요
Object
를 사용하면 끝이다.예제
피보나치 수열 구하기
n개의 계단을 오를 때 한 계단 씩, 또는 두 계단 씩, 최대 세 계단 씩 오를 수 있다.
계단을 오르는데 총 몇 가지 방법이 있는가?