이번 문제는 입력된 두 배열의 원소를 각각 곱한 후 합하였을 때 최솟값이 되는 값을 구하는 문제이다. 처음에는 B에 있는 수를 재배열하면 안된다고 되어있어서 헤맸었다. 한참을 헤매다 이전에 Python으로 같은 문제를 푼 기억이 나서 B에 있는 수도 재배열함으로써 문제를 해결하였다.(B에 있는 수를 재배열해도 채점되는 것에는 문제가 없다.)
그리고 나는 BufferedReader를 이용하여 문제를 풀었지만, 입력받는 배열이 한 줄 띄어쓰기가 아닌 한 칸 띄어쓰기 되어있기 때문에 readLine()으로 입력받은 값을 가져와 Parsing 과정을 별도로 추가 해주어야한다. 따라서 Scanner을 사용하는 편이 더 편리했지 않았을까 생각된다.
BufferedReader를 사용하여 입력을 받았을 때는 StringTokenizer를 사용하여 입력받은 값을 Parsing 해주면 된다.
정렬 자체는 입력 받는 숫자들의 범위가 크지 않아서 Arrays.sort()를 사용했다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class P1026{
public static void main(String[] args) throws IOException {
// 해당 문제는 Scanner를 사용하는게 더 편리할 듯 함
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
int sum = 0; // 마지막에 출력할 숫자(두 배열 원소 곱의 총합)
int arrA[] = new int [n];
int arrB[] = new int [n];
st = new StringTokenizer(br.readLine());
for(int i = 0; i < n; i++)
arrA[i] = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
for(int i = 0; i < n; i++)
arrB[i] = Integer.parseInt(st.nextToken());
br.close();
// 정렬
Arrays.sort(arrA);
Arrays.sort(arrB);
for(int i = 0; i < n; i++)
sum += (arrA[i] * arrB[n-i-1]);
System.out.println(sum);
}
}