과일 장수가 사과 상자를 포장하고 있습니다.
사과는 상태에 따라 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 함수를 완성해주세요.
요즘 정답률이 높으 순으로 문제를 정렬한 후에 문제를 선택햇 풀고있는데
이버 문제가 윗쪽에 위치해 있어서 별거아닌 문제인데도 약간 위축된게 없지않아 있었던것같다..
문제를 다시 해석해보면 품질이 좋은 순서대로 정렬한 후 순서대로 상자에 갯수만큼 담아주면 최대 이익이 나오는데
마지막에 상자에 들어간 사과의 품질만 알 수 있다면 나머지 값는은 필요가 없다고 생각했다.
따라서 array 리스트에 score 값들을 담아서 내림차순 정렬해준 뒤
(어차피 배열을 역순으로 하기위해서는 Integer 로 다시 배열을 만들어줘야해서
내가 자주 사용하느 array list 로 만들어줬다.)
상자 마지막에 들어갈 사과의 등급 x 상자에 들어간 사과 갯수를 한뒤 반복문으로 값을 더해줬다.
문제가 너무 쉬워서 분명 효율성이라던가 내가 놓친게 있을줄 알았는데 허무하게 한번에 풀려버렸다..
이 문제의 정답률이 왜이리 낮지? 하면서 확인해보니 나온지 얼마 안되서 참여한 사람도 얼마 없는것같다.
너무 쉽게 풀리니 오히려 허무하고 아쉬웟다..
public static void main(String[] args) {
int answer = 0;
int k = 4;
int m = 3;
int [] score = {4, 1, 2, 2, 4, 4, 4, 4, 1, 2, 4, 2};
//---------------------------------------------//
ArrayList<Integer> grade = new ArrayList<>();
for (int i = 0 ; i< score.length ; i++)
grade.add(score[i]);
// 배열 내림차순 정렬
Collections.sort(grade,Collections.reverseOrder());
// 0 부터 시작할 경우 곱해도 0이 되기 때문에 의미가 없어서 i=1 부터 시작
// 상자에 담을 수 있는 수 보다 사과가 적다면 어차피 판매하지 않기때문에 한계는 단순 나눗샘으로 정했음
for (int i = 1 ; i<= grade.size()/m ; i++){
// 담을 수 있는 갯수를 단순 더하면 맨 앞에 넣은 score가 측정되기 때문에
// -1 을 해서 마지막에 넣은 사과를 선택하게 했음
answer += grade.get((i * m) - 1)*m;
}
System.out.println(answer);
}