과일 장수가 사과 상자를 포장하고 있습니다. 사과는 상태에 따라 1점부터 k점까지의 점수로 분류하며, k점이 최상품의 사과이고 1점이 최하품의 사과입니다. 사과 한 상자의 가격은 다음과 같이 결정됩니다.
예를 들어, k = 3, m = 4, 사과 7개의 점수가 [1, 2, 3, 1, 2, 3, 1]이라면, 다음과 같이 [2, 3, 2, 3]으로 구성된 사과 상자 1개를 만들어 판매하여 최대 이익을 얻을 수 있습니다.
k | m | score | result |
---|---|---|---|
3 | 4 | [1, 2, 3, 1, 2, 3, 1] | 8 |
4 | 3 | [4, 1, 2, 2, 4, 4, 4, 4, 1, 2, 4, 2] | 33 |
최대의 효율을 가지기 위해 최소값이 큰박스일수록 좋다.
score 배열을 오름차순으로 정렬한다.
score 배열을 역순으로 탐색하면서 boxCount를 세어 한 박스갯수(m) 만큼 탐색하면 최소값(minBoxScore)를 이용하여 박스의 가치구하고 answer에 더한다.
import java.util.Arrays;
class Solution {
public int solution(int k, int m, int[] score) {
int answer = 0;
int boxCount = 0;
int minBoxScore = k;
Arrays.sort(score);
for (int i = score.length - 1; i >= 0; i--) {
if (minBoxScore > score[i]) minBoxScore = score[i];
boxCount++;
if (boxCount >= m) {
boxCount = 0;
answer += minBoxScore * m;
minBoxScore = k;
}
}
return answer;
}
}
최솟값을 탐색하면서 구하지 말고 정렬하였기에 한 박스 구간에서 제일 첫 인덱스를 계산할 수 있었다.
그렇게 박스의 개수만큼 반복하면서 최솟값에 바로 접근하여 계산하였다면 반복문 시행 횟수를 더욱 줄일 수 있었다.