알고리즘/백준

백준-10844번/쉬운 계단 수 (java)

연향동큰손 2024. 2. 13. 14:59

 

문제

45656이란 수를 보자.

이 수는 인접한 모든 자리의 차이가 1이다. 이런 수를 계단 수라고 한다.

N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구해보자. 0으로 시작하는 수는 계단수가 아니다.

 

입력

첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다.

 

출력

첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.

 

다이나믹 프로그래밍 문제이므로 배열을 생성 해야한다.

이 문제에서는 첫번째 자리의 숫자 뒤에 올수 있는 계단수를 구하기 위해 이차원 배열을 만들어 줘야 한다.

 

문제를 풀때 가장 고민을 많이 했던 부분은  0으로 시작하는 수는 아니지만 1로 시작할때는 뒤에 0으로 시작하는 계단수가 필요하다는 점 이다!

 

따라서 0으로 시작하는 계단수도 구하되, 누적합을 구할때는 0으로 시작하는 계단수는 빼 줌으로써 올바른 계단수를 구할 수 있다.

 

점화식

 

for(int i=0; i<=9; i++) {
			arr[1][i]=1;
		}
		
		for(int i=2; i<=n; i++) { //j는 맨 앞 자리의 숫자, i는 전체 자릿수 
			arr[i][0] = arr[i-1][1];
			for(int j=1; j<=9; j++) {
				if(j==9) {
					arr[i][9]=arr[i-1][8]%1000000000;
				}
				else {
					arr[i][j]=(arr[i-1][j-1]%1000000000+arr[i-1][j+1]%1000000000)%1000000000;
				}
			}
		}

j는 맨 앞자리의 숫자 , i는 전체 자릿수를 뜻함

우선 전체 자릿수가 1일때는 1,2,3,4,5,6,7,8,9가 계단 수 이므로 i가 1일때는 모두 1로 초기화 시켜준다

그리고 0으로 시작할때는 그 다음수가 1만 올 수 있기 때문에

arr[i][0] = arr[i-1][1];

다음과 같은 식이 나온다.

첫번째 자리의 수가 9일때도 다음 숫자는 8만 올 수 있기때문에

arr[i][9]=arr[i-1][8]%1000000000;

다음과 같은 식이 나온다.

 

점화식을 바탕으로 결과값을 얻는 정답 코드는 다음과 같다.

import java.util.Scanner;

public class Main {
	
	public static void main(String[] args){
		Scanner scanner = new Scanner(System.in);
		int n=scanner.nextInt();
		long[][] arr = new long[n+1][10];
		for(int i=0; i<=9; i++) {
			arr[1][i]=1;
		}
		
		for(int i=2; i<=n; i++) { //j는 맨 앞 자리의 숫자, i는 전체 자릿수 
			arr[i][0] = arr[i-1][1];
			for(int j=1; j<=9; j++) {
				if(j==9) {
					arr[i][9]=arr[i-1][8]%1000000000;
				}
				else {
					arr[i][j]=(arr[i-1][j-1]%1000000000+arr[i-1][j+1]%1000000000)%1000000000;
				}
			}
		}
		long x=0;
		for(int i=1; i<=9; i++) {
			x=(x+arr[n][i])%1000000000;
		}
		System.out.println(x);
	}
}