[프로그래머스/Java] - Lv1.과일장수

Eunjeon_g·2023년 2월 26일
0

사과의 값이 score배열에 들어있고, 최상품의 가격이 k다.
사과를 m개씩 박스에 나눠 담은 후 최종 값이 정해진다.
한 상자의 값은 상자 내 최하위 상품의 값 * m 이다.
가능한 많은 상자를 팔았을 때 얻을 수 있는 최대 이익을 구하라.
(사과는 상자 단위로만 판매하며, 남는 사과는 버립니다.)

입출력 예

kmscoreresult
34[1, 2, 3, 1, 2, 3, 1]8
43[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개씩 줄어드는 것이다.

0개의 댓글