https://swexpertacademy.com/main/code/problem/problemDetail.do
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
접근 방법
DFS를 이용해 풀었다.
단순 비교에 배열을 합해야 하는 경우가 있어 int 배열보단 char 배열로 저장하는 게 더 편했다.
왼쪽 수보다 오른쪽 수가 더 크거나 같을 경우 (체크 - 교환 - 재귀 - 교환) 했다.
check는 이번 깊이 탐색에 교환이 있었는지를 나타내며, 다른 깊이 탐색도 고려해 매번 윗줄에 check를 초기화해야 했다.
교환이 없었다면, 완벽히 정렬되어 짝수 번 혹은 홀수 번이 남은 상황이며
짝수일 경우 바로 제거, 홀수일 경우 맨끝의 두 수를 swap한 후 제거했다.
소스 코드
import java.util.*;
import java.io.*;
class Solution {
static int num_length, mx;
static char[] m;
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for(int tc = 1; tc <= T; tc++) {
String num = sc.next();
num_length = num.length();
mx = 0;
m = num.toCharArray();
int cg = sc.nextInt();
bfs(0, cg);
System.out.println("#" + tc + " " + mx);
}
}
static void bfs(int idx, int cnt) {
if(cnt == 0) {
String s = String.valueOf(m);
mx = Math.max(mx, Integer.valueOf(s));
return;
}
boolean check = false;
for(int i=idx; i<num_length; i++) {
for(int j=num_length-1; j>i; j--) {
if (m[i]-'0' <= m[j]-'0') {
check = true;
swap(i, j);
bfs(i, cnt-1);
swap(i, j);
}
}
}
if(!check) {
if(cnt%2 ==1) {
swap(num_length-1, num_length-2);
bfs(num_length-1, 0);
swap(num_length-1, num_length-2);
}
else {
bfs(num_length-1, 0);
}
}
}
static void swap(int a, int b) {
char temp = m[a];
m[a] = m[b];
m[b] = temp;
}
}
'코테 > 자바' 카테고리의 다른 글
[SWEA] 1226. 미로1 (0) | 2023.05.18 |
---|---|
[SWEA] 2817. 부분 수열의 합 (0) | 2023.05.18 |
[SWEA] 2814. 최장 경로 (0) | 2023.05.17 |
[SWEA] 1209. Sum (0) | 2023.05.17 |
[SWEA] 1240. 단순 2진 암호코드 (0) | 2023.05.17 |