과일 장수가 사과 상자를 포장하고 있습니다. 사과는 상태에 따라 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 |
입출력 예 #1
흐름
- 전체 사과 리스트인 LinkedList와 한 사과박스로 칭할 ArrayList를 선언한다.
- 사과 리스트를 최상품 순으로 정렬한다.
- 한 사과박스(ArrayList)에 사과를 m개씩 담는다. 이 때, 전체 사과 리스트가 최상품 순으로 정렬되어 있기 때문에 최대 이익이 날 수 있도록 담긴다.
- 담았던 사과박스가 다 찼을 경우, 사과 상자의 가격을 계산한다.
- 박스에 담은 사과 개수(m)만큼 전체 사과 리스트(LinkedList)에서 제거한다.
- 사과를 다시 담기 위해 사과박스(ArrayList)를 비워준다.
- 전체 사과 리스트(LinkedList)가 한 사과박스 당 담을 수 있는 사과 개수(m) 이상 남아 있을 동안 만큼 반복한다.
public class ex02 {
static int solution(int k, int m, int[] score) {
int answer = 0;
int boxAmount = 0; // 한 사과박스 당 가격
List<Integer> appleList = new LinkedList<>(); // 전체 사과 리스트
ArrayList<Integer> box = new ArrayList<>(); // 한 사과박스
for (int s : score) {
appleList.add(s);
}
Collections.sort(appleList, Collections.reverseOrder()); // 사과를 최상품 순으로 정렬
while (appleList.size() >= m) {
for (int i = 0; i < m; i++) {
box.add(appleList.get(i));
}
if (box.size() == m) {
// 내림차순으로 정렬된 리스트에서 순차적으로 넣었기 때문에,
// 맨 마지막 인덱스의 사과점수로 가격 계산
boxAmount = box.get(box.size() - 1) * m;
answer += boxAmount;
for (int j = 0; j < m; j++) {
appleList.remove(0);
}
}
box.clear();
}
return answer;
}
public static void main(String[] args) {
// int k = 3;
// int m = 4;
// int[] score = {1, 2, 3, 1, 2, 3, 1};
int k = 4;
int m = 3;
int[] score = {4, 1, 2, 2, 4, 4, 4, 4, 1, 2, 4, 2};
solution(k, m, score);
}
}
출처 - https://school.programmers.co.kr/learn/courses/30/lessons/135808