사과의 값이 score배열에 들어있고, 최상품의 가격이 k다.
사과를 m개씩 박스에 나눠 담은 후 최종 값이 정해진다.
한 상자의 값은 상자 내 최하위 상품의 값 * m 이다.
가능한 많은 상자를 팔았을 때 얻을 수 있는 최대 이익을 구하라.
(사과는 상자 단위로만 판매하며, 남는 사과는 버립니다.)
입출력 예
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 |
배열을 정렬하고, m개씩 나눈 후 첫번째 값을 더하면 될 것 같다.
import java.util.*;
class Solution {
public int solution(int k, int m, int[] score) {
//k = 최상품가격, m개씩
int answer = 0;
int len = score.length;
//제한사항
if(k<3 || k>9 || m <3 || m > 10 || len <7 ||len > 1000000)
return answer;
for(int n:score){
if(n < 0 || n > 1000000)
return answer;
}
//시작
Arrays.sort(score);
for(int i=len-m; i >= 0; i-=m){
answer = answer + m * score[i];
}
return answer;
}
}
배열 정렬 함수 Arrays.sort(score)를 통해 과일의 값을 정렬해주면, 오름차순으로 정렬이 된다.
입력 예 첫번째의 결과값으로 [ 1, 1, 1, 2, 2, 3, 3] 과 같이 정렬될 것이다.
배열을 뒤에서부터 계산해야 최상위 값들을 우선적으로 상자에 담을 수 있다.
: 버림 (1, 1, 1), 판매 (2, 2, 3, 3)
상자의 값 = m * 최하위 값이다. 그러므로 i의 초기값을 m개씩 묶었을때 첫번째 값인 len - m 으로 한다. i의 값을 m개씩 줄여나가면 다음 상자의 첫번째 값을 구할 수 있다.
이해가 잘 안되면 바꿔서 생각해본다.
배열을 m개씩 묶을 때마다 첫번째 값을 구해야 한다면, i = 0이 될 것이고, i는 m씩 증가할 것이다.
뒤에서부터 값을 구해야 하므로 초기값이 길이 - m 이 되는 것이고, m개씩 줄어드는 것이다.