반응형
https://www.acmicpc.net/problem/16943
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
2 초 | 512 MB | 1522 | 699 | 518 | 42.704% |
문제
두 정수 A와 B가 있을 때, A에 포함된 숫자의 순서를 섞어서 새로운 수 C를 만들려고 한다. 즉, C는 A의 순열 중 하나가 되어야 한다.
가능한 C 중에서 B보다 작으면서, 가장 큰 값을 구해보자. C는 0으로 시작하면 안 된다.
입력
첫째 줄에 두 정수 A와 B가 주어진다.
출력
B보다 작은 C중에서 가장 큰 값을 출력한다. 그러한 C가 없는 경우에는 -1을 출력한다.
제한
- 1 ≤ A, B < 109
예제 입력 1
1234 3456
예제 출력 1
3421
예제 입력 2
1000 5
예제 출력 2
-1
예제 입력 3
789 123
예제 출력 3
-1
코드
/**
* BOJ 16943 숫자 재배치 : Silver 1
* 순열
*/
import java.io.*;
import java.util.*;
public class p16943 {
static String a, b;
static int bNum;
static int[] arr;
static boolean[] visited;
static int answer;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
a = st.nextToken();
bNum = Integer.parseInt(st.nextToken());
visited = new boolean[a.length()];
arr = new int[a.length()];
for (int i = 0; i < arr.length; i++) {
arr[i] = a.charAt(i) - '0';
}
answer = -1;
nextPermutation(0, 0);
System.out.println(answer);
}
/**
*
* @param depth depth번째 수
* @param num : 순열로 만들어진 숫자.
*/
static void nextPermutation(int depth, int num) {
// base case
if (depth == a.length()) {
answer = Math.max(answer, num);
return;
}
// implementation
for (int i = 0; i < a.length(); i++) {
if (visited[i]) continue;
if (depth == 0 && arr[i] == 0) continue; // 맨 앞자리가 0일 땐 넘어감
if (num * 10 + arr[i] > bNum) continue; // 다음 순열에 해당하는 값이 b보다 크다면 넘어감
visited[i] = true;
nextPermutation(depth + 1, num * 10 + arr[i]);
visited[i] = false;
}
}
}
반응형
'알고리즘 > [ Baekjoon ]' 카테고리의 다른 글
[ BOJ ][JAVA][16953] A -> B (0) | 2021.11.02 |
---|---|
[ BOJ ][JAVA][6159] 코스튬 파티 (0) | 2021.11.01 |
[ BOJ ][JAVA][9461] 파도반 수열 (0) | 2021.10.28 |
[ BOJ ][JAVA][20665] 독서실 거리두기 (0) | 2021.10.27 |
[ BOJ ][JAVA][16928] 뱀과 사다리 게임 (0) | 2021.10.27 |