Algorithm/Greedy

[Baekjoon 1026 / Java / 실버4] 보물

양선규 2024. 5. 3. 17:20
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
반응형