문제 내용은 입력으로 숫자 배열 두개를 받는데, 두 배열을 A배열[0] * B배열[0] + .. 이런 식으로 동일한 인덱스를 곱셈 처리하면서 하나씩 더해주되, A배열의 위치를 변경해서 가장 작은 값이 출력되면 되겠다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Stack;
import java.util.stream.Collectors;
public class Treasure {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int count = Integer.parseInt(br.readLine());
int[] aArray = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
Arrays.sort(aArray);
Stack<Integer> stack = new Stack<>();
for (int i = aArray.length - 1; i >= 0; i--) {
stack.push(aArray[i]);
}
int[] bArray = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
int[] filteredAarray = new int[count];
LinkedList<Integer> bList = Arrays.stream(bArray)
.boxed()
.collect(Collectors.toCollection(LinkedList::new));
for (int i = 0; i < count; i++) {
int maxIndex = bList.indexOf(Collections.max(bList));
bList.set(maxIndex, -1);
filteredAarray[maxIndex] = stack.pop();
}
int ans = 0;
for (int i = 0; i < count; i++) {
ans += filteredAarray[i] * bArray[i];
}
System.out.println(ans);
}
}
문제를 풀어보자면 결국 B 배열은 변경할 수 없고, A배열만 순서를 변경해서 최소값을 만들어야 하므로 A배열을 정렬한 뒤 작은 값부터 Stack에 넣어준 후, B배열의 최대값 인덱스 순서대로 A값을 순서대로 넣어주면 A배열의 가장 작은 값을 B배열의 가장 큰 값과 매칭시킬 수 있고 이후에는 각 배열을 곱한 결과를 출력해주면 끝이다.
Leave a Reply