sm 기술 블로그
134. 10844(쉬운 계단 수) 본문
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
Long[][] dp = new Long[N + 1][10];
Long sum = 0L;
for (int i = 0; i < N + 1; i++) {
for (int j = 0; j < 10; j++) {
dp[i][j] = 0L;
}
}
for (int i = 1; i < 10; i++) {
dp[0][i] = 1L;
}
for (int i = 1; i < N + 1; i++) {
for (int 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;
}
}
}
for (Long val : dp[N - 1]) {
sum += val;
}
System.out.println(sum % 1000000000);
}
}
문제요약
서로 1씩 차이가 나는 수를 계단수라고 함.
길이 N이 주어졌을 때 계단수의 개수에 1000000000 을 나눈 나머지는 몇인가?
(ex 길이 1 => 1 2 3 4 5 6 7 8 9 길이 2 => 01 10 12 21 23 32 34 43 45 54 56 65 67 76 78 87 89 98)
설명
길이가 2로 들어왔다고 가정해보자.
십의 자리 수에서 계단수는 01,10,12,21,23,32,34,43,45,54,56,65,67,76,78,87,89,98이다.
하지만 01은 십의자리 수가 아니므로 개수에서 빼준다.
그림을 그리면 다음과 같다.
이런식으로 계속 나아가면 된다.
예를들어 길이가 3이 들어왔으면,
다음과 같이 진행된다.
for i in range(1,10):
dp[1][i] = 1
index가 0인 경우 모두 1이기 때문에 다음과 같이 1로 초기화 해준다.
0으로 시작하는 수는 계단수가 아니기 때문에 0에는 1로 초기화 하지 않는다.
for i in range(2,N+1):
for j in range(10):
if j == 0 :
dp[i][j] = dp[i-1][1]
elif j == 9:
dp[i][j] = dp[i-1][8]
else :
dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1]
dp[인덱스][0~9] 로 생각하면 쉽다.
j = 0일때 => 0인 경우 1 값이 해당된다.
j = 9일때 => 9인 경우 8 값이 해당된다.
두 경우를 제외하고는 [이전 인덱스][자신의 수 -1] + [이전 인덱스][자신의 수 +1] 이 dp에 저장되게 된다.
'문제 > 백준_자바' 카테고리의 다른 글
136. 11053(가장 긴 증가하는 부분 수열) (0) | 2022.07.08 |
---|---|
135. 2156(포도주 시식) (0) | 2022.07.08 |
134. 10844(쉬운 계단 수) (0) | 2022.07.05 |
133. 1463(1로 만들기) (0) | 2022.07.05 |
132. 2579(계단 오르기) (0) | 2022.07.04 |
Comments