본문 바로가기
알고리즘 문제 풀이/그리디

1710. Maximum Units on a Truck

by 가나무마 2021. 6. 23.
728x90

링크

이중 배열 boxTypes에는 길이가 2인 배열이 있습니다.

그 배열에 첫번째 요소는 박스의 개수, 두번째는 들어있는 요소의 개수입니다.

[[1,3],[2,2],[3,1]]이면

박스는 1개 박스 1개에 3개씩

박스는 2개 박스 1개에 2개씩

박스는 3개 박스 1개에 1개씩입니다.

접근방법

최대 무게부터 차례대로 최대한 무게를 뽑자.

무게 내림차순으로 정렬해서 [1,3],[2,2],[3,1]로 만듭니다.

최대 뽑을 수 있는 박스 개수는 4개이므로 3kg 1개, 2kg 2개, 1kg 1개 뽑아서 8kg됨.

import java.util.Arrays;
import java.util.Comparator;

class Solution {
    public int maximumUnits(int[][] boxTypes, int truckSize) {
        //박스의 무게를 기준으로 내림차순으로 정렬합니다.
        Arrays.sort(boxTypes, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if (o1[1] < o2[1]) {
                    return 1;
                } else if (o1[1] > o2[1]) {
                    return -1;
                }
                return 0;
            }
        });

        //현재 트럭이 가지고 있는 박스 개수
        int currentWeight = 0;
        //현재 트럭의 들어있는 박스의 개수
        int currentBox = 0;

        //박스
        for (int[] box : boxTypes) {
            //box[0] : 박스 개수
            //box[1] : 박스의 무게

            //각 배열마다 들어갈 수 있는 박스의 개수에 최대값을 넣은 후
            //그 값이 트럭의 한계보다 크면, 들어갈 수 있는 개수만 넣어줍니다.
            //만약에 박스 개수의 최대값과 현재 박스 개수의 합이
            //트럭의 한계보다 작거나 같다면 최대값만큼 현재 박스 개수를 늘려주고,
            //무게*최대개수만큼 무게를 더해줍니다.
            if (currentBox + box[0] > truckSize) {
                currentWeight += box[1] * (truckSize - currentBox);
                currentBox += truckSize - currentBox;
            } else {
                currentWeight += box[1] * box[0];
                currentBox += box[0];
            }

            //현재 박스의 개수가 트럭이 가질 수 있는 박스 개수와 같아지면 반복문을 빠져 나옵니다.
            if (currentBox == truckSize) {
                break;
            }
        }

        return currentWeight;
    }
}

쓸데없는 변수가 너무 많은 듯. currentBox도 굳이 없어도 될 거 같다.

728x90
반응형