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
반응형
'알고리즘 문제 풀이 > 그리디' 카테고리의 다른 글
942. DI String Match (0) | 2021.08.11 |
---|---|
561. Array Partition I (0) | 2021.07.25 |
Minimum Subsequence in Non-Increasing Order (0) | 2021.04.08 |
Number Of Rectangles That Can Form The Largest Square (0) | 2021.04.06 |
Split a String in Balanced Strings (0) | 2021.04.06 |