코딩테스트/BOJ

[BOJ] 1562 계단수 - JAVA

5월._. 2023. 2. 19.
728x90

1. 문제

 

1562번: 계단 수

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

www.acmicpc.net

45656이란 수를 보자.
이 수는 인접한 모든 자리의 차이가 1이다. 이런 수를 계단 수라고 한다.
N이 주어질 때, 길이가 N이면서 0부터 9까지 숫자가 모두 등장하는 계단 수가 총 몇 개 있는지 구하는 프로그램을 작성하시오. 0으로 시작하는 수는 계단수가 아니다.


2. 풀이

[이 문제]와 비슷하다. 뽑힌 숫자를 비트마스킹으로 배열에 같이 저장하는 것만 다르다. 

import java.io.*;

public class BOJ_1562_계단수 {
	public static void main(String[] args) throws IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(in.readLine());

		long MOD = 1000000000;
		int last = 1<<10;

		long[][][] nums = new long[N][10][last];
		for(int i=1;i<10;i++){
			nums[0][i][1<<i] = 1;
		}

		for(int i=1;i<N;i++){
			for(int j=0;j<10;j++){
				for(int k=0;k<last;k++){
					if(j==0){
						nums[i][j][k|1] = (nums[i][j][k|1] + nums[i-1][j+1][k])%MOD;
					}
					else if(j==9){
						nums[i][j][k|1<<9] = (nums[i][j][k|(1<<9)] + nums[i-1][j-1][k])%MOD;
					}
					else{
						//오버플로우 방지
						nums[i][j][k|(1<<j)] = (nums[i][j][k|(1<<j)] + nums[i-1][j+1][k])%MOD;
						nums[i][j][k|(1<<j)] = (nums[i][j][k|(1<<j)] + nums[i-1][j-1][k])%MOD;
					}
				}
			}
		}

		long sum = 0;
		for (int i = 0; i < 10; i++) {
			sum = (sum + nums[N - 1][i][last-1]) % MOD;
		}

		System.out.println(sum);
	}
}

 


3. 결과

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ] 1916 최소비용 구하기 - JAVA  (0) 2023.02.21
[BOJ] 12904 A와 B - JAVA  (0) 2023.02.20
[BOJ] 1700 멀티탭 스케줄링 - JAVA  (0) 2023.02.18
[BOJ] 5904 Moo게임 - JAVA  (0) 2023.02.17
[BOJ] 11000 강의실 배정 - JAVA  (0) 2023.02.15

댓글