일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 프로그래머스
- SERVLET
- mysql
- mst
- 부스트코스
- 순열 알고리즘
- 벡엔드
- 백준
- 해시
- 다이나믹 프로그래밍
- jsp
- DP
- Kruskal's Algorithm
- 크루스칼 알고리즘
- 소수
- greedy
- request
- 브라우저
- 웹프로그래밍
- 웹서버
- 네이버 부스트캠프 ai tech
- 정렬 알고리즘
- Prim's Algorithm
- dbms
- 그리디
- 프림 알고리즘
- 정렬
- programmers
- BJ
- 웹 프로그래밍
- Today
- Total
끵뀐꿩긘의 여러가지
백준 - 10844번, 쉬운 계단 수 (sol.java) 본문
◎문제 링크
https://www.acmicpc.net/problem/10844
10844번: 쉬운 계단 수
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
www.acmicpc.net
◎문제 파악:
계단수: 모든 자리수의 차이가 1이 나는 수
목표: N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구하기
1. 1 자리 수일 때: 1~9의 수는 모두 계단수이다.
2. 2 자리 수일 때,
0으로 시작하는 수는 1의 자리에 1을 붙일 수 있다. --> 01 (1 자리 수의 배열 index 1참조)
1로 시작하는 수는 1의 자리에 0이나 2를 붙일 수 있다. --> 10,12 (1 자리 수의 배열 index 0,2 참조)
2로 시작하는 수는 1의 자리에 1이나 3을 붙일 수 있다. --> 21,23 (1 자리 수의 배열 index 1,3 참조)
...
9로 시작하는 수는 1의 자리에 8을 붙일 수 있다. --> 98 (1 자리 수의 배열 index 8 참조)
※ 0으로 시작하는 수는 없기 때문에 0을 고려하지 않는 것이 아니라,
그 다음 배열에서 1이 그 전 배열의 0을 사용하므로, 0까지 생각해주고 마지막에 종합할 때만 빼면 된다.
DP를 활용하여, 그 전 자리 수의 계단 수 배열을 참고하여 N자리 수의 계단수 배열을 만든다.
1의 자리 수 계단수
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
10의 자리 수 계단수
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 1 |
100의 자리수 계단수
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
2 | 3 | 4 | 4 | 4 | 4 | 4 | 4 | 3 | 2 |
- 100의 자리수가 3일때 만들어질 수 있는 계단수의 개수는 4개이다.
◎코드 구현
package ProgrammersBj.Bj_NumberOfEasySteps;
import java.io.*;
public class MySolution {
//목표 n번째 자리까지, 현재 now자리, arr: now-1번째 자리의 0~9로 시작하는 계단 숫자들의 개수
public void solution(int n, int now, int[] arr) {
//목표 자릿수에 도달하면, 1~9로 시작하는 값을 합침 (0으로 시작하는 숫자는 없으므로)
if(n==now) {
int answer=0;
for(int i = 1; i<10;i++) {
answer = (answer + arr[i])%1000000000;
}
System.out.print(answer);
return;
}
//0~9로 시작하는 계단 숫자들의 개수를 위한 임시 배열
int[] tmp = new int[10];
for(int i = 0; i<10;i++) {
//0으로 시작하면 그 전 수가 1이 될 수 밖에 없다
if(i==0) {
tmp[i] = arr[1];
//9로 시작하면 그 전 수가 8이 될 수 밖에 없다
}else if(i==9) {
tmp[i] = arr[8];
// 0이나 9가 아닌 , i로 시작하면, 그 전수가 i-1이나, i+1일 수 있다.
}else {
tmp[i] = (arr[i-1] + arr[i+1])%1000000000;
}
}
// int의 범위 때문에 그리고 정답을 1,000,000,000으로 나눈 나머지를 출력하는것이기 때문에
// %1000000000을 계산시마다 해준다.
solution(n,now+1,tmp);
}
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(br.readLine());
int[] arr = {1,1,1,1,1,1,1,1,1,1};
MySolution sol = new MySolution();
sol.solution(n,1,arr);
}
}
실행 결과:
입력: 2
출력: 17
◎Github codes
jerry-ryu/java_problemsolving_algorithm
solving problems and learning algorithm using java - jerry-ryu/java_problemsolving_algorithm
github.com
'JAVA > 문제풀이 - 프로그래머스' 카테고리의 다른 글
프로그래머스 - 여행경로 (sol.java) (0) | 2021.08.07 |
---|---|
백준 - 2156번, 포도주 시식 (sol.java) (0) | 2021.05.30 |
백준 - 1436번, 1로 만들기 (sol.java) (0) | 2021.05.30 |
프로그래머스 - 단속카메라 (sol.java) (0) | 2021.05.26 |
프로그래머스 - 섬 연결하기 (sol.java) (0) | 2021.05.24 |