백준
[백준 JAVA] 1026 : 보물
mak-ing
2024. 3. 12. 15:32
[백준 1026] 보물 : https://www.acmicpc.net/problem/1026
1026번: 보물
첫째 줄에 N이 주어진다. 둘째 줄에는 A에 있는 N개의 수가 순서대로 주어지고, 셋째 줄에는 B에 있는 수가 순서대로 주어진다. N은 50보다 작거나 같은 자연수이고, A와 B의 각 원소는 100보다 작거
www.acmicpc.net
문제 조건 정리
- S = A[0] × B[0] + ... + A[N-1] × B[N-1]
S의 값을 최소화하자.
입력
- 첫째 줄에 N이 주어진다.
- 둘째 줄에는 A에 있는 N개의 수가 순서대로 주어진다.
- 셋째 줄에는 B에 있는 수가 순서대로 주어진다.
- N은 50보다 작거나 같은 자연수이고, A와 B의 각 원소는 100보다 작거나 같은 음이 아닌 정수이다.
문제를 풀기 전
- S = A[0] × B[0] + ... + A[N-1] × B[N-1]
-> S를 최소화하기 위해서는 A배열의 가장 작은 값과 B배열의 가장 큰 값을 곱할 수 있도록 배치해야한다!
-> 오름차순으로 정렬된 배열과 내림차순으로 정렬된 배열을 곱해야겠다!
-> 오름차순으로 정렬된 배열의 i번째 요소와 오름차순으로 정렬된 배열의 (N-i-1)번째 요소를 곱해도 되겠다!
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(bufferedReader.readLine());
int[] a = new int[n];
int[] b = new int[n];
// a 배열과 b 배열의 값을 입력받음
StringTokenizer stringTokenizer1 = new StringTokenizer(bufferedReader.readLine(), " ");
StringTokenizer stringTokenizer2 = new StringTokenizer(bufferedReader.readLine(), " ");
for (int i = 0; i < n; i++) {
a[i] = Integer.parseInt(stringTokenizer1.nextToken());
b[i] = Integer.parseInt(stringTokenizer2.nextToken());
}
// a 배열과 b 배열을 오름차순으로 정렬함
Arrays.sort(a);
Arrays.sort(b);
// 결과값 저장을 위한 변수
int res = 0;
// a 배열의 i번째 요소와 b 배열의 n-i-1번째 요소를 곱한 값을 res 에 더함
// ex) n이 5라면 (0 ~ 4) -> 0번째 요소와 4번째 요소를 곱한 값을 res에 더함
for (int i = 0; i < n; i++) {
res += a[i] * b[n - i - 1];
}
// 결과 출력
System.out.println(res);
}
}
문제를 풀고 난 후
그리디 알고리즘을 이해하기에 매우 직관적인 문제라고 생각함!
알고리즘과 상관없이 문제를 풀며 배운 점이 있었는데, stringTokenizer를 두개 이상 사용해서 동시에 입력을 받을 수 있다는 점이다!