알고리즘/[ Baekjoon ]

[ BOJ ][JAVA][16943] 숫자 재배치

kim.svadoz 2021. 10. 28. 17:28
반응형

https://www.acmicpc.net/problem/16943

 

16943번: 숫자 재배치

두 정수 A와 B가 있을 때, A에 포함된 숫자의 순서를 섞어서 새로운 수 C를 만들려고 한다. 즉, C는 A의 순열 중 하나가 되어야 한다.  가능한 C 중에서 B보다 작으면서, 가장 큰 값을 구해보자. C는 0

www.acmicpc.net

시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
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;
        }
    }
}
반응형