728x90
반응형
두 배열이 있고 배열의 길이는 같다.
각 배열 같은 인덱스의 값들을 곱한 값을 전부 더하는데, 그 값을 최소로 만들어야 한다.
A 배열은 재배열할 수 있고 B 배열은 재배열할 수 없다.
A 배열을 내림차순 정렬한 후, B배열의 최솟값을 찾아 차례대로 곱하여 더해주면 해결할 수 있다.
import java.io.*;
import java.util.*;
public class 보물_1026 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
// N 입력받기
int N = Integer.parseInt(br.readLine());
// a, b 배열 생성
int a[] = new int[N];
int b[] = new int[N];
// a 배열 입력받기
st = new StringTokenizer(br.readLine());
for(int i = 0; i < N; i++) {
a[i] = Integer.parseInt(st.nextToken());
}
// a 배열 내림차순 정렬
Arrays.sort(a);
for(int i = 0; i < a.length / 2; i++) {
int temp = a[i];
a[i] = a[a.length - 1 - i];
a[a.length - 1 - i] = temp;
}
// b 배열 입력받기
st = new StringTokenizer(br.readLine());
for(int i = 0; i < N; i++) {
b[i] = Integer.parseInt(st.nextToken());
}
// 결과값을 저장할 변수
int result = 0;
// a의 가장 큰 값과 b의 가장 작은 값을 곱하여 result에 더해준다
for(int i = 0; i < N; i++) {
int minIndex = findMinIndex(b);
result += a[i] * b[minIndex];
b[minIndex] = Integer.MAX_VALUE;
}
System.out.println(result);
}
// 배열에서 가장 작은 값의 인덱스를 찾는 함수
public static int findMinIndex(int[] arr) {
int minIndex = 0;
for(int i = 1; i < arr.length; i++) {
if(arr[i] < arr[minIndex]) {
minIndex = i;
}
}
return minIndex;
}
}
자바엔 배열을 내림차순 정렬해주는 함수도 없고, 배열에서 가장 작은 값의 인덱스를 찾아주는 함수도 없고, 배열에서 값을 아예 빼버리는 것도 불가능했다.
따라서 내림차순 정렬은 반복문으로 구현했고, 가장 작은 값의 인덱스를 찾는 함수를 findMinIndex로 따로 구현했다. 그리고 배열에서 값을 뺄 수 없으니 이미 최소값으로 구해진 인덱스의 값은 다음 최솟값을 구할 때 영향을 주지 않도록 MAX_VALUE로 바꿔줬다.
이렇게 N번 반복하는 for문을 돌리면 쉽게 해결할 수 있는 문제였다.
728x90
반응형
'Algorithm > Greedy' 카테고리의 다른 글
[Baekjoon 1911 / Python / 골드5] 흙길 보수하기 (0) | 2024.08.19 |
---|---|
[Baekjoon 7983 / Java / 골드5] 내일 할거야 (0) | 2024.05.06 |
[Baekjoon 1931 / python / 실버1] 회의실 배정 (0) | 2024.04.06 |
[Baekjoon 1541 / python / 실버2] 잃어버린 괄호 (0) | 2024.04.05 |
[Baekjoon 11047 / python / 실버4] 동전 0 (0) | 2024.04.05 |