1038번: 감소하는 수
음이 아닌 정수 X의 자릿수가 가장 큰 자릿수부터 작은 자릿수까지 감소한다면, 그 수를 감소하는 수라고 한다. 예를 들어, 321과 950은 감소하는 수지만, 322와 958은 아니다. N번째 감소하는 수를
www.acmicpc.net
1. 문제
음이 아닌 정수 X의 자릿수가 가장 큰 자릿수부터 작은 자릿수까지 감소한다면, 그 수를 감소하는 수라고 한다. 예를 들어, 321과 950은 감소하는 수지만, 322와 958은 아니다. N번째 감소하는 수를 출력하는 프로그램을 작성하시오. 0은 0번째 감소하는 수이고, 1은 1번째 감소하는 수이다. 만약 N번째 감소하는 수가 없다면 -1을 출력한다.
2. 생각
자연수 n이 감소하는 수라면 n % 10 > i >= 0인 i에 대해서 n * 10 + i도 감소하는 수임을 이용했다.
n % 10 == 0이라면 i가 없으므로 종료한다.
n에 0부터 9까지 차례대로 넣어 감소하는 수 list를 만들고 오름차순으로 정렬했다.
findDecreasingNum( n )은 결국 숫자 n으로 시작하는 모든 감소하는 수를 찾겠다는 의미이다.
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 집합에서 선택된 수를 조합하면 감소하는 수는 하나로 특정되기 때문에 감소하는 수는 1023개임을 알 수 있다.때문에 1022번째가 마지막 감소하는 수이다.
3. 코드
package B;
import java.util.*;
import java.io.*;
public class Main {
static List<Long> list = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
if (n > 1022) System.out.println(-1);
else {
for (int i = 0; i < 10; i++) findDecreasingNum(i);
Collections.sort(list);
System.out.println(list.get(n));
}
}
public static void findDecreasingNum (long n) {
list.add(n);
long d = n % 10;
if (d <= 0) return;
for (long i = d - 1; i >= 0; i--) {
findDecreasingNum(n * 10 + i);
}
}
}
'BOJ' 카테고리의 다른 글
[BOJ] [JAVA] 4134번 다음 소수 (0) | 2024.01.07 |
---|---|
[BOJ] [JAVA] 13241번 최소공배수 (0) | 2024.01.06 |
[BOJ] [JAVA] 10816번 숫자 카드 2 (0) | 2024.01.06 |
[BOJ] [JAVA] 7785번 회사에 있는 사람 (0) | 2024.01.06 |
[BOJ] [JAVA] 18870번 좌표 압축 (2) | 2024.01.06 |
[BOJ] [JAVA] 10815번 숫자 카드 (1) | 2024.01.06 |
[Programmers][Python] 소수 찾기 (0) | 2023.12.29 |
[BOJ] [JAVA] 11650번 좌표 정렬하기 (0) | 2023.12.28 |