티스토리 뷰
728x90
반응형
문제 요약
- 알고리즘 분류: 동적계획법, dp
- 난이도: Silver1
- 문제내용:
- 수의 자리가 오름차순으로 정렬 되어있는 수를 오르막 수이다.
- 자리수 N개일때 오르막 수 개수를 구해라.
문제풀이
이번 문제는 10의 1000승 만큼 모든 숫자를 구하는 기에는 무리가 있다.
N = int(input())
count = 0
for num in range(0, 10**N):
flag = 1
str_num = str(num)
for i in range(1, len(str_num)):
if str_num[i] < str_num[i - 1]:
flag = 0
break
count += flag
print(count)
위 코드 처럼 1 부터 10의 1000승까지에 N만큼 오름 차순으로 구하면 O(10** n * n) 만큼 복잡도가 나오기 때문에 시간 초과가 나올것이다. 그래서 동적 계획법으로 한다. 동적계획법의 자세한 설명은 여기에 확인 해보면 된다. dp문제는 구현하는 능력보다 아이디어를 요구하기 때문에 점화식을 짜는 방법만 알면 쉽게 풀수 있다. 일단 점화식 구하는 방법은 쉽다.
문제 접근 방법
점화식을 구하는 방법 이전에 자리수마다 나올수 있는 경우의 수를 생각해보면 i 자리의 수는 i - 1 자리수 이하 숫자 밑으로 나올수 있다. 그러면 그 이하의 수 경우의 수를 더하기만 하면된다. 즉 i - 1 이하 숫자 다 더하기만 하면 된다.
다시 처음으로 돌아면 1자리수는 모두다 되기 때문에 1로 선언하고 그 다음 각 자리 수마다 이전 자리수 미만 숫자 다 더 하면된다. 그 다음 N자리까지 다 구하면 N자리 각 숫자를 더해서 출력하면된다.
정리
- 첫번째 자리수에 0 ~ 9 까지 1로 선언한다.
- i 자리에서 i - 1 자리수 이하는 다 더한다.
- N자리까지 다 구했으면 N자리의 각 숫자의 경우의 수를 다 더해라
Code
Python
N = int(input())
count = 0
for num in range(0, 10**N):
flag = 1
str_num = str(num)
for i in range(1, len(str_num)):
if str_num[i] < str_num[i - 1]:
flag = 0
break
count += flag
print(count)
Java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[][] dp = new int[N + 1][10];
Arrays.setAll(dp[1], i -> 1);
for(int i = 2; i <= N; i++) {
for(int j = 0; j < 10; j++) {
for(int k = 0; k <= j; k++) {
dp[i][j] += dp[i - 1][k];
}
dp[i][j] %= 10007;
}
}
System.out.println(Arrays.stream(dp[N]).sum() % 10007);
}
}
728x90
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[BAEKJOON]7562 나이트의 이동 (0) | 2023.02.08 |
---|---|
[BAEKJOON]1850 최대공약수 (0) | 2023.02.07 |
[BAEKJOON]24445 알고리즘 수업 - 너비 우선 탐색 2 (0) | 2023.02.03 |
[BAEKJOON]24444 알고리즘 수업 - 너비 우선 탐색 1 (0) | 2023.02.02 |
[BAEKJOON]24480 알고리즘 수업 - 깊이 우선 탐색 2 (0) | 2023.02.01 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 동적 계획법
- Python
- BaekJoon
- 수학
- DFS
- spring-boot
- 동적계획법
- 그리디
- LeetCode
- 구현
- DP
- JSCODE
- 배열
- 알고리즘
- 백준
- Programmerse
- 이론
- BFS
- 파이썬
- 백트레킹
- Greedy
- 그래프
- level2
- 재귀호출
- 자바
- 누적합
- java
- 넓이 우선 탐색
- 조합
- 문자열
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함