이 문제는 두가지로 풀이하였다.
첫번째는 완전 탐색을 하였고, 두번째는 탐욕적인 알고리즘으로 풀이하였다.
결론은 완전 탐색은 시간 초과가 나와서 두번째 방식으로 풀이했다.
각각의 풀이 방법을 정리해보겠다.
이 풀이에서 생각해볼 것이 두가지 있다.
1. Java 내부의 정렬은 어떤 알고리즘을 사용할까?
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static int MINIMUM_RESULT = Integer.MAX_VALUE;
static int N;
static int[] A;
static int[] B;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.iin));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
A = new int[N];
B = new int[N];
int[] output = new int[N];
boolean[] visited = new boolean[N];
// A 초기화
st = new StringTokenizer(br.readLine());
for(int i = 0; i < N; i++) {
A[i] = Integer.parseInt(st.nextToken());
}
// B 초기화
st = new StringTokenizer(br.readLine());
for(int i = 0; i < N; i++) {
B[i] = Integer.parseInt(st.nextToken());
}
perm(A, B, output, visited, 0, N);
System.out.println(MINIMUM_RESULT);
}
static void perm(int[] a, int[] b, int[] output, boolean[] visited, int depth, int n) {
if (depth == n) {
int result = 0;
for (int i = 0; i < n; i++) {
result += output[i] * b[i];
}
if (result < MINIMUM_RESULT) {
MINIMUM_RESULT = result;
}
}
for (int i = 0; i < n; i++) {
if (visited[i] != true) {
visited[i] = true;
output[depth] = a[i];
perm(a, b, output, visited, depth + 1, n);
visited[i] = false;
}
}
}
}
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int N;
static int[] A;
static int[] B;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken()); // 길이
A = new int[N];
B = new int[N];
// A 초기화 -> A의 수를 재배열할 수 있고 B는 재배열할 수 없음
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
A[i] = Integer.parseInt(st.nextToken());
}
// B 초기화
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
B[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(A);
Arrays.sort(B);
int result = 0;
for (int i = 0; i < N; i++) {
result += A[i] * B[N - 1 - i];
}
System.out.println(result);
}
}
Reference