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 |
댓글