2023.01.27 Complete !
과일 장수가 사과 상자를 포장하고 있습니다. 사과는 상태에 따라 1점부터 k점까지의 점수로 분류하며, k점이 최상품의 사과이고 1점이 최하품의 사과입니다. 사과 한 상자의 가격은 다음과 같이 결정됩니다.
과일 장수가 가능한 많은 사과를 팔았을 때, 얻을 수 있는 최대 이익을 계산하고자 합니다. (사과는 상자 단위로만 판매하며, 남는 사과는 버립니다)
예를 들어,k
= 3,m
= 4, 사과 7개의 점수가 [1, 2, 3, 1, 2, 3, 1]이라면, 다음과 같이 [2, 3, 2, 3]으로 구성된 사과 상자 1개를 만들어 판매하여 최대 이익을 얻을 수 있습니다.
사과의 최대 점수
k
, 한 상자에 들어가는 사과의 수m
, 사과들의 점수score
가 주어졌을 때, 과일 장수가 얻을 수 있는 최대 이익을 return하는 solution 함수를 완성해주세요.
k
≤ 9m
≤ 10score
의 길이 ≤ 1,000,000score[i]
≤ kk | 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
입출력 예 #2
사과 상자 | 가격 |
---|---|
[1, 1, 2] | 1 x 3 = 3 |
[2, 2, 2] | 2 x 3 = 6 |
[4, 4, 4] | 4 x 3 = 12 |
[4, 4, 4] | 4 x 3 = 12 |
따라서 (1 x 3 x 1) + (2 x 3 x 1) + (4 x 3 x 2) = 33을 return합니다.
m
개만큼 넣기 위해 카운팅하고 그 때마다 최솟값을 갱신한다.m
개만큼 포장하면, 최솟값과 m
개를 곱해서 값을 구한다.import java.util.*;
class Solution {
public int solution(int k, int m, int[] score) {
int answer = 0;
int cnt = 0, min = 0;
ArrayList<Integer> arr = new ArrayList<>();
Arrays.sort(score);
for(int i=1; i<=score.length; i++) {
cnt++;
arr.add(score[score.length-i]);
if(cnt == m) {
min = Collections.min(arr);
answer = answer+min*m;
cnt = 0;
arr.clear();
}
}
return answer;
}
}
import java.util.*;
class Solution {
public int solution(int k, int m, int[] score) {
int answer = 0;
Arrays.sort(score);
for(int i = score.length; i >= m; i -= m){
answer += score[i - m] * m;
}
return answer;
}
}
sort도 똑같이 하고 score.length를 이용해서 돌리려는 시도도 동일했다.
나는 카운트를 세서 m까지 돌리면 다시 리스트를 묶어주는 방법이였으나
이 분의 방법은 m까지 진행하고 m씩 감소시키며 진행하고 최소값만 찾으면 됨으로 배열을 모두 순회하지 않는다 라는 것이였다. m개씩 끊게되면 제일 뒤 숫자가 작을것이 분명함으로 그 숫자들만 *m 해서 더해준다.
💡 EX) [4, 1, 2, 2, 4, 4, 4, 4, 1, 2, 4, 2]
→ 1 1 2 / 2 2 2 / 4 4 4/ 4 4 4 ( m = 3 )
오름차순 정렬 i-m (12 - m = 9 )
딱 최소값들이 들어감
효율적이고 깔끔한 그런 코드를 짤 수 있는 개발자가 되야겠다.