[백준] 23883: 알고리즘 수업 - 선택 정렬 3 - JAVA
https://www.acmicpc.net/problem/23883
풀이
선택정렬은 O(n^2)의 시간복잡도를 갖기때문에 그대로 구현하면 시간초과가 났다.
따라서 정렬이 되는 TreeMap을 이용했다.
TreeMap에 숫자와 처음 인덱스를 넣고 뒤에서 부터 꺼내면서 인덱스 교체가 필요할 경우 교체해주었다.
메모리: 122416KB
시간: 1564ms
언어: Java 11
코드
import java.util.*;
import java.io.*;
public class Main {
static int[] arr;
static int N, K, cnt, ans_a, ans_b;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
int[] arr = new int[N];
TreeMap<Integer, Integer> map = new TreeMap<>();
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
map.put(arr[i], i);
}
cnt = 0;
ans_a = 0;
ans_b = 0;
for (int i = N - 1; i >= 0; i--) {
int m = map.pollLastEntry().getValue();
if (i == m) {
continue;
}
cnt++;
boolean flag = swap(arr, map, i, m);
if (flag) {
break;
}
}
if (ans_a == 0) {
System.out.println(-1);
} else {
System.out.println(ans_a + " " + ans_b);
}
}
private static boolean swap(int[] a, TreeMap<Integer, Integer> map, int i, int j) {
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
map.put(a[j], j);
if (cnt == K) {
ans_a = a[j];
ans_b = a[i];
return true;
}
return false;
}
}