백준 10844[자바] java 쉬운 계단 수
문제 링크:https://www.acmicpc.net/problem/10844
10844번: 쉬운 계단 수
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
www.acmicpc.net
▶문제
45656이란 수를 보자.
이 수는 인접한 모든 자리의 차이가 1이다. 이런 수를 계단 수라고 한다.
N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구해보자. 0으로 시작하는 수는 계단수가 아니다.
▶입력
첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다.
▶출력
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
▶해설
조건을 살펴보겠습니다.
1. 인접한 모든 자리의 차이가 1인 수들
2. 1,000,000,000 으로 나누기
신경써야할 조건은 1번 뿐입니다. 한 자리 수 -> 두 자리 수 -> 세 자리 수로 자리수를 늘려가며 조건을 만족하는 수를 찾으면 됩니다. 끝자리 수가 2~8의 경우 다음 끝자리 숫자에서 +-1이 가능합니다. 하지만 끝자리가 0과9의 경우 0 = 1, 9 = 8 만 가능합니다. 따라서 자리수를 늘려가며, 끝자리에 따라서 더하는 수를 다르게 하면 간단하게 풀립니다.
따라서 아래의 점화식을 도출할 수 있습니다.
if(num==0){ // index는 자리수, num = 끝의 자리 숫자 dp[index][num] = solve(index-1, 1); } else if(num==9){ dp[index][num] = solve(index-1, 8); } else{ dp[index][num] = solve(index-1,num+1)+solve(index-1, num-1); }
전체 코드
import java.io.*; import java.util.*; public class Main { static long [][] dp; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader (new InputStreamReader (System.in)); int n = Integer.parseInt(br.readLine()); dp = new long[n+1][10]; for(int i=0; i<=9; i++){ dp[1][i]=1l; } long result=0; for(int i=1; i<=9; i++){ result+=solve(n, i); } System.out.println((result)%1000000000); } private static long solve(int index, int num){ if(index==1){ return dp[index][num]; } if(dp[index][num]==0){ if(num==0){ dp[index][num] = solve(index-1, 1); } else if(num==9){ dp[index][num] = solve(index-1, 8); } else{ dp[index][num] = solve(index-1,num+1)+solve(index-1, num-1); } } return dp[index][num]%1000000000; } }

'Alogorithm > DP' 카테고리의 다른 글
백준 2228[자바] java 구간 나누기 (0) | 2022.03.21 |
---|---|
백준 1915[자바] java 가장 큰 정사각형 (0) | 2022.03.18 |
백준 18427[자바] java 함께 블록 쌓기 (0) | 2022.03.15 |
백준 21941[자바] java 문자열 제거 (0) | 2022.03.14 |
백준 17485[자바] java 진우의 달 여행 (0) | 2022.03.13 |
댓글
이 글 공유하기
다른 글
-
백준 2228[자바] java 구간 나누기
백준 2228[자바] java 구간 나누기
2022.03.21문제 링크: https://www.acmicpc.net/problem/2228 2228번: 구간 나누기 N(1 ≤ N ≤ 100)개의 수로 이루어진 1차원 배열이 있다. 이 배열에서 M(1 ≤ M ≤ ⌈(N/2)⌉)개의 구간을 선택해서, 구간에 속한 수들의 총 합이 최대가 되도록 하려 한다. 단, 다음의 조건들이 만족되 www.acmicpc.net ▶문제 N(1 ≤ N ≤ 100)개의 수로 이루어진 1차원 배열이 있다. 이 배열에서 M(1 ≤ M ≤ ⌈(N/2)⌉)개의 구간을 선택해서, 구간에 속한 수들의 총 합이 최대가 되도록 하려 한다. 단, 다음의 조건들이 만족되어야 한다. 각 구간은 한 개 이상의 연속된 수들로 이루어진다. 서로 다른 두 구간끼리 겹쳐있거나 인접해 있어서는 안 된다. 정확히 M개의… -
백준 1915[자바] java 가장 큰 정사각형
백준 1915[자바] java 가장 큰 정사각형
2022.03.18문제 링크: https://www.acmicpc.net/problem/1915 1915번: 가장 큰 정사각형 첫째 줄에 n, m(1 ≤ n, m ≤ 1,000)이 주어진다. 다음 n개의 줄에는 m개의 숫자로 배열이 주어진다. www.acmicpc.net ▶문제 n×m의 0, 1로 된 배열이 있다. 이 배열에서 1로 된 가장 큰 정사각형의 크기를 구하는 프로그램을 작성하시오. 0 1 0 0 0 1 1 1 1 1 1 0 0 0 1 0 위와 같은 예제에서는 가운데의 2 × 2 배열이 가장 큰 정사각형이다. ▶입력 첫째 줄에 n, m(1 ≤ n, m ≤ 1,000)이 주어진다. 다음 n개의 줄에는 m개의 숫자로 배열이 주어진다. ▶출력 첫째 줄에 가장 큰 정사각형의 넓이를 출력한다. ▶해설 조건을 살펴보겠습니다… -
백준 18427[자바] java 함께 블록 쌓기
백준 18427[자바] java 함께 블록 쌓기
2022.03.15문제 링크: https://www.acmicpc.net/problem/18427 18427번: 함께 블록 쌓기 첫째 줄에 자연수 N, M, H가 공백을 기준으로 구분되어 주어진다. (1 ≤ N ≤ 50, 1 ≤ M ≤ 10, 1 ≤ H ≤ 1,000) 둘째 줄부터 N개의 줄에 걸쳐서 각 학생이 가진 블록들의 높이가 공백을 기준으로 구 www.acmicpc.net ▶문제 1번부터 N번까지의 학생들은 각각 블록들을 가지고 있다. 학생마다 최대 M개의 블록을 가지고 있을 수 있으며, 한 명의 학생이 가지고 있는 모든 블록들의 높이는 서로 다르다. 이때 1번부터 N번까지의 학생들이 가진 블록을 차례대로 사용하여 바닥에서부터 쌓아 올려 하나의 탑을 만들고자 한다. 단, 어떤 학생의 블록은 사용하지 않아도 되며 한… -
백준 21941[자바] java 문자열 제거
백준 21941[자바] java 문자열 제거
2022.03.14
댓글을 사용할 수 없습니다.