• 문제 링크
2529번: 부등호
여러분은 제시된 부등호 관계를 만족하는 k+1 자리의 최대, 최소 정수를 첫째 줄과 둘째 줄에 각각 출력해야 한다. 단 아래 예(1)과 같이 첫 자리가 0인 경우도 정수에 포함되어야 한다. 모든 입력
www.acmicpc.net
• 풀이 과정
방문 여부를 확인할 boolean 배열을 활용하는 재귀 함수로 모든 순열을 확인하되,
입력으로 주어진 부등호에 맞는 다음 수를 선택하는 함수로 검사하여 다음 수를 결정한다.
이전 인덱스의 수와 현재의 수가 부등호 조건에 맞을 경우에 String 변수에 더하는 방식이며
String 변수의 길이가 비교할 수의 크기와 같을 때 해당 분기 탐색이 완료되었으므로 List 에 더한다.
자연스럽게 모든 순열 중 최대값은 List 의 마지막 인덱스에 위치할 것이고 최소값은 첫번째 인덱스이므로
그 두 인덱스의 값을 추출하여 정답으로써 출력한다.
• 풀이 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
public class Main {
static int n;
static char[] sign;
static boolean[] visit = new boolean[10];
static List<String> result = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
n = Integer.parseInt(br.readLine());
sign = br.readLine().replaceAll(" ", "").toCharArray();
recur("", 0);
bw.write(result.get(result.size() - 1) + "\n" + result.get(0));
bw.flush();
}
private static void recur(String num, int idx) {
if (idx == n + 1) {
result.add(num);
return;
}
for (int i = 0; i <= 9; i++) {
if (visit[i])
continue;
if (idx == 0 || compare(num.charAt(idx - 1) - '0', i, sign[idx - 1])) {
visit[i] = true;
recur(num + i, idx + 1);
visit[i] = false;
}
}
}
private static boolean compare(int prev, int now, char sign) {
if (sign == '<')
return prev < now;
else
return prev > now;
}
}
'Problem Solving > Baekjoon' 카테고리의 다른 글
[백준] 6603 로또- Backtracking / Java (0) | 2022.07.07 |
---|---|
[백준] 9663 N-Queen - Backtracking / Java (0) | 2022.07.06 |
[백준] 1182 부분수열의 합 - Backtracking / Java (0) | 2022.07.04 |
[백준] 14888 연산자 끼워넣기 - Backtracking / Java (0) | 2022.07.03 |
[백준] 16236 아기 상어 - Implementation / Java (0) | 2022.07.02 |
댓글