Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- BFS
- 코딩테스트
- 그래프
- 완전 탐색
- 좋은 수열
- 프로그래머스
- 백트랙킹
- DP
- 너비우선탐색
- 순열장난
- Java
- BOJ
- 위클리 챌린지
- 39080
- 백트래킹
- 위클리 6주차
- 부분 수열의 합
- 복서 정렬하기
- 문서자동화
- ElementTree
- 입실 퇴실
- openssl
- 백트렉킹
- 줄어드는 숫자
- 몯느 순열
- 10597
- 1174
- dfs
- 백준
- 재귀
Archives
개발자-H 입니다.
BOJ - 줄어드는 숫자 본문
https://www.acmicpc.net/problem/1174
1174번: 줄어드는 숫자
음이 아닌 정수를 십진법으로 표기했을 때, 왼쪽에서부터 자리수가 감소할 때, 그 수를 줄어드는 숫자라고 한다. 예를 들어, 321와 950은 줄어드는 숫자이고, 322와 958은 아니다. N번째로 작은 줄어
www.acmicpc.net
- 백트래킹 탐색 문제이다.
- 총 1023가지 경우의 수가 나온다. 첫 번째가 1부터 시작함에 주의한다.
- 다음 탐색 조건을 앞의 숫자와 비교하여 작을 시 탐색한 뒤 주어진 번째 수가 맞다면 탈출 하는 방법을 사용했다.
import java.io.*;
import java.util.*;
public class Main {
private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
private static int N = 0;
//선택 할 수 있는 십진법 가지수
private static String choices = "0123456789";
private static int dpOrder = 0;
public static void main(String[] args) throws IOException {
N = Integer.parseInt(br.readLine());
//최대 N자리를 선택 하는 DP
for (int i = 1; i <= 10; i++) {
boolean[] visit = new boolean[11];
dp(visit, 0, "", i);
}
//찾을 수 없다면 -1 출력
System.out.println(-1);
}
private static void dp(boolean[] visit, int depth, String number, int numberOfDigit) {
if (depth == numberOfDigit) {
if (N == dpOrder + 1) {
//가지수 안에 있을 시 바로 종료
System.out.println(number);
System.exit(0);
}
dpOrder += 1;
return;
}
for (int i = 0; i < choices.length(); i++) {
if (visit[i]) continue;
visit[i] = true;
if (depth == 0) {
dp(visit, depth + 1,
number + choices.charAt(i),
numberOfDigit);
} else {
//앞 자리수 보다 작은 경우에만 탐색함
int front = Character.getNumericValue(number.charAt(number.length() - 1));
int next = Character.getNumericValue(choices.charAt(i));
if (front > next) {
dp(visit, depth + 1,
number + choices.charAt(i),
numberOfDigit);
}
}
visit[i] = false;
}
}
}