https://www.acmicpc.net/problem/10844
10844번: 쉬운 계단 수
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
www.acmicpc.net
문제 요약
숫자 N이 주어질 때 쉬운 계단 수가 될 수 있는 경우의 수의 합을 구하라.
쉬운 계단 수는 각 자리 앞뒤 수 와의 차이가 1인 수
예를 들면 123456
풀이방법
DP 중에서도 Bottom-up으로 풀이
문제의 포인트는 마지막 숫자가 무엇인가
예를 들어 2가 input으로 주어졌을 때
한자리 수 쉬운 계단수의 조합으로 두자리 수를 구하게 되는데
0에서 파생될 수 있는 경우의 수는 01 뿐인데 반해
1에서 파생될 수 있는 경우의 수는 10과 12가 된다.
이런 경우는 0과 9에만 해당되며 나머지숫자는 앞뒤 배열의 합으로 표현할 수 있다.
구현 하면서의 포인트는
숫자의 크기가 크기 때문에 long타입으로 선언할것.
그리고 1000000000으로 나눠주되 중간중간 계산할 때에도 계속 나눌 것.
JAVA 코드
import java.io.*;
public class Main {
final static long SUB = 1000000000;
public static void main(String args[]) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int input = Integer.parseInt(reader.readLine());
long[][] arr = new long[input+1][10];
//한자리 수는 0빼고 1-9까지 1로 초기화
for(int i=1; i<10; i++){
arr[1][i] = 1;
}
//0과 9는 1과 8배열 만 가져올 수 있다.
for(int i=2; i<input+1; i++){
for(int j=0; j<10; j++){
if(j == 0){
arr[i][j] = arr[i-1][1] % SUB;
}else if(j == 9){
arr[i][j] = arr[i-1][8] % SUB;
}else{
arr[i][j] = (arr[i-1][j-1] + arr[i-1][j+1]) % SUB;
}
}
}
long sum = 0;
for(int i=0; i<10; i++){
sum += arr[input][i];
}
System.out.println(sum % SUB);
reader.close();
}
}
'PROGRAMMING > ALGORITHM' 카테고리의 다른 글
| [프로그래머스] 가장 큰 수 JAVA (0) | 2021.06.12 |
|---|---|
| [백준] 2193번 이친수 JAVA DP (0) | 2021.06.10 |
| [프로그래머스] 기능개발 JAVA (0) | 2021.05.26 |
| [프로그래머스] 모의고사 JAVA (0) | 2021.05.23 |
| [프로그래머스] 체육복 JAVA (0) | 2021.05.22 |