문제 설명
줄어드는 수 중 n번째인것을 출력하는 문제이다.
줄어드는 수를 321,950과 같은 숫자가 왼쪽에서 오른쪽으로 한자리씩 봤을 때, 작은 수여야 한다고 한다.
322와 859는 줄어드는 수가 아니라고 한다.
해당 문제는 아이디어를 잘 내야한다..
주의사항
n의 입력을 명시적으로 주고 있지만 얼만큼의 줄어드는 수를 만들어야 할지 고민일 것이다.
위 문제를 보면 줄어드는 수 중 가장 큰수는 987654321이라는 것을 알 수 있다.
TRY
선형적으로 1부터 987654321까지 String으로 변환하여 stack을 이용하여 줄어드는 수인지 판별 [시간초과]
- 백트래킹 9876543210을 배열에 위치시켜 하나씩 골라 수를 만든다. [성공]
- 수를 만들때 이전에 골랐던 범위는 절대 선택하지 않도록 해야한다.
풀이
public class DecresingNumber {
private static Set<Long> answer;
private static int[] numbers;
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(reader.readLine());
System.out.println(solution(n));
}
public static long solution(int n) {
answer = new HashSet<>();
numbers = new int[] {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
create(0, 0);
List<Long> results = answer.stream()
.sorted()
.collect(Collectors.toList());
if (results.size() < n) {
return -1;
}
return results.get(n-1);
}
public static void create(int cnt, long makingNumber) {
answer.add(makingNumber);
if (cnt >= 10) {
return;
}
create(cnt + 1, makingNumber * 10 + numbers[cnt]);
create(cnt + 1, makingNumber);
}
}
'Algorithm > 백준' 카테고리의 다른 글
백준 - 좋은 수열 (0) | 2023.04.25 |
---|---|
백준 - 스도쿠 (0) | 2023.04.22 |
백준 - 계란으로계란치기 (0) | 2023.04.15 |
백준 - 계단 오르기 (0) | 2023.04.11 |
백준 - A와B2 (0) | 2023.04.05 |
댓글