[백준] 2529번: 부등호 (Java)
https://www.acmicpc.net/problem/2529
입력 : 첫번째 줄-부등호 문자의 개수 k
두번째 줄-k개의 부등호 기호 (공백으로 구분)
출력 : 첫번째 줄-부등호 관계를 만족하는 k+1 자리의 최대, 최소 정수
두번째 줄-부등호 관계를 만족하는 k+1 자리의 최소 정수
O(n!)
dfs
구현
import java.util.*;
public class Main {
static int k;
static char[] operators;
static boolean[] visited = new boolean[10];
static ArrayList<String> results = new ArrayList<>();
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
k = scanner.nextInt();
operators = new char[k];
for (int i = 0; i < k; i++) {
operators[i] = scanner.next().charAt(0);
}
// 백트래킹을 사용하여 가능한 모든 숫자 조합을 만듦
for (int i = 0; i <= 9; i++) {
visited[i] = true;
dfs("" + i, 0);
visited[i] = false;
}
// 가능한 결과를 정렬하여 최소값과 최대값을 찾음
Collections.sort(results);
System.out.println(results.get(results.size() - 1)); // 최대값 출력
System.out.println(results.get(0)); // 최소값 출력
}
static void dfs(String num, int depth) {
if (depth == k) {
results.add(num);
return;
}
for (int i = 0; i <= 9; i++) {
if (!visited[i] && check(num.charAt(num.length() - 1) - '0', i, operators[depth])) {
visited[i] = true;
dfs(num + i, depth + 1);
visited[i] = false;
}
}
}
static boolean check(int a, int b, char op) {
if (op == '<') {
return a < b;
} else {
return a > b;
}
}
}