[백준] 10844. 쉬운 계단 수
문제 링크
풀이 과정
[백준] 1562. 계단수에서 0부터 9까지의 수가 한 번씩만 등장해야 하는 조건이 없는 문제입니다.
dp = new int[10][N + 1];
dp[i][j]
는 첫 번째 수가 i로 시작하는 길이가 j인 모든 가능한 계단 수의 총 개수를 의미합니다.
static int go(int now, int length) {
if (length == N) {
return 1;
}
if (dp[now][length] != -1) {
return dp[now][length];
}
int ret = 0;
if (now - 1 >= 0) {
ret += go(now - 1, length + 1);
}
if (now + 1 <= 9) {
ret += go(now + 1, length + 1);
}
dp[now][length] = ret % MOD;
return dp[now][length];
}
Top-down 방식의 go()
는 재귀로 구현됩니다. 계단 수를 만들어가는 과정 중, 현재 숫자 now
와 현재까지의 길이 length
를 파라미터로 받습니다.
작동 과정은 다음과 같습니다.
length
가 N이면, 조건을 만족하는 계단 수를 하나 만든 것이므로, 1을 리턴한다.dp[now][length]
를 이미 구한적이 있다면 그 값을 사용하도록 리턴한다.- 구한적이 없다면, 계단 수 조건에 맞게
now
값과length
를 조정해 재귀를 호출해 그 개수를 얻어온다.
코드
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int N;
static int[][] dp;
static final int MOD = (int) 1e9;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
dp = new int[10][N + 1];
int answer = 0;
for (int i = 1; i <= 9; i++) {
init();
answer += go(i, 1);
answer %= MOD;
}
System.out.println(answer);
}
static int go(int now, int length) {
if (length == N) {
return 1;
}
if (dp[now][length] != -1) {
return dp[now][length];
}
int ret = 0;
if (now - 1 >= 0) {
ret += go(now - 1, length + 1);
}
if (now + 1 <= 9) {
ret += go(now + 1, length + 1);
}
dp[now][length] = ret % MOD;
return dp[now][length];
}
static void init() {
for (int i = 0; i < 10; i++) {
Arrays.fill(dp[i], -1);
}
}
}
댓글남기기