728x90
소스코드
let fs = require('fs');
const filePath = process.platform === `linux` ? `/dev/stdin` : `예제.txt`;
let input = fs.readFileSync(filePath).toString().split(' ');
const c = console.log
n = Number(input[0])
let dp = []
for(let i = 0 ; i < n+1 ; i++){
dp[i] = []
for(let j = 0 ; j < 10 ; j++){
dp[i][j] = 0
}
}
for(let i = 1 ; i<10 ; i++){
dp[1][i] = 1
}
for (let i = 2 ; i < n+1 ; i++){
for (let j = 0 ; j < 10 ; j++){
if (j === 0){
dp[i][j] = (dp[i-1][1]) % 1000000000
}
else if (j === 9) {
dp[i][j] = dp[i-1][8] % 1000000000
}
else {
dp[i][j] = ((dp[i-1][j+1]) + (dp[i-1][j-1])) % 1000000000
}
}
}
add = (dp) =>{
return dp.reduce((a,b) => a+b,0)
}
c((add(dp[n]) % 1000000000))
풀이
일단 2차원배열을 생성해준 후 dp[i][j] 에서 i = 자릿수, j = 마지막에 올 숫자로 정해줍니다.
1자리수 일때는 1,2, ... , 9 이므로 이므로 dp[1][1] = 1 ... dp[1][9] = 1 이라 해줍니다.
그 후 dp[2][0] 은 10인 경우 밖에 없으므로 dp[1][1] 의 값을 넣어줍니다
2 같은 경우에는 끝자리1에서 나오고 3에서도 나올 수 있으니 dp[1][1] + dp[1][3] 이라는 식을 얻게 됩니다.
점화식을 이용하면 dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1] 이라는 식을 얻습니다.
9는 89인 경우 밖에 없으므로 dp[1][8] 의 값을 넣어줍니다.
문제
https://www.acmicpc.net/problem/10844
10844번: 쉬운 계단 수
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
www.acmicpc.net
728x90
'BOJ > 다이나믹 프로그래밍' 카테고리의 다른 글
BOJ : 11722 가장 긴 감소하는 부분 수열 (JS) (0) | 2023.01.02 |
---|---|
BOJ : 11054 가장긴바이토닉부분수열 (JS) (0) | 2023.01.01 |
BOJ : 2193 이친수 (JS) (0) | 2022.12.29 |
BOJ : 1904 01수열 (JS) (2) | 2022.12.28 |
BOJ : 24416 알고리즘수업 피보나치(1) (JS) (0) | 2022.12.27 |