728x90
문제
2529번: 부등호
두 종류의 부등호 기호 ‘<’와 ‘>’가 k개 나열된 순서열 A가 있다. 우리는 이 부등호 기호 앞뒤에 서로 다른 한 자릿수 숫자를 넣어서 모든 부등호 관계를 만족시키려고 한다. 예를 들어, 제시
www.acmicpc.net
접근 방식
백트래킹을 사용해 0 ~ 9까지의 수들을 한 번만 사용하며 조합해가면서
주어진 부등호의 순서와 대소관계가 일치하는지 확인해주면 된다.
첫 번째 고른 숫자를 제외하고 이후에는 부등호와 이전 숫자와 현재 숫자가
일치하는지 확인해주며 진행하면 된다.
모든 숫자를 고른 후에 부등호를 비교하는 것도 상관 없지만
매번 숫자를 고를 때마다 확인하면 중간에 맞지 않는 경우에 멈출 수 있어서 좋다.
k가 9인 경우 최대 값이 9876543210이기 때문에 int 타입의 변수로 값을 다루면
오버플로우나 예외가 발생할 수 있으니 이 부분만 조심하면 된다.
풀이
public class Main {
static int k, end;
static long max = 0, min = Long.MAX_VALUE;
static String maxStr = "", minStr = "";
static String[] sign;
static char[] nums;
static boolean[] isUsedSign;
static boolean[] isUsedNum = new boolean[10];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
k = Integer.parseInt(br.readLine());
end = k + 1;
sign = new String[k];
isUsedSign = new boolean[k];
nums = new char[end];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < k; i++) {
sign[i] = st.nextToken();
}
solve(0);
System.out.println(maxStr + "\n" + minStr);
}
static void solve(int size) {
if (size == end) {
String s = new String(nums);
long num = Long.parseLong(s);
if (max < num) {
maxStr = s;
max = num;
}
if (min > num) {
minStr = s;
min = num;
}
return;
}
for (int i = 0; i < 10; i++) {
if (isUsedNum[i]) continue;
if (size == 0) {
isUsedNum[i] = true;
nums[size] = (char)(i + '0');
solve(size + 1);
isUsedNum[i] = false;
}
else {
if (isSatisfied(size, i)) {
isUsedNum[i] = true;
nums[size] = (char)(i + '0');
solve(size + 1);
isUsedNum[i] = false;
}
}
}
}
static boolean isSatisfied(int size, int y) {
int x = nums[size - 1] - '0';
return (sign[size - 1].equals(">") && x > y) || (sign[size - 1].equals("<") && x < y);
}
}
'Java > Algorithms' 카테고리의 다른 글
[백준] 1759번 : 암호 만들기 (0) | 2024.04.11 |
---|---|
[백준] 15658번 : 연산자 끼워넣기 (2) (0) | 2024.04.10 |
[백준] 10819번 : 차이를 최대로 (0) | 2024.04.08 |
[백준] 27964번 : 콰트로치즈피자 (0) | 2024.04.07 |
[백준] 12789번 : 도키도키 간식드리미 (1) | 2024.04.06 |