[Java] 프로그래머스 과일 장수
2023. 2. 7. 17:07ㆍ알고리즘
728x90
문제 설명
과일 장수가 사과 상자를 포장하고 있습니다. 사과는 상태에 따라 1점부터 k점까지의 점수로 분류하며, k점이 최상품의 사과이고 1점이 최하품의 사과입니다. 사과 한 상자의 가격은 다음과 같이 결정됩니다.
- 한 상자에 사과를 m개씩 담아 포장합니다.
- 상자에 담긴 사과 중 가장 낮은 점수가 p (1 ≤ p ≤ k)점인 경우, 사과 한 상자의 가격은 p * m 입니다.
과일 장수가 가능한 많은 사과를 팔았을 때, 얻을 수 있는 최대 이익을 계산하고자 합니다.(사과는 상자 단위로만 판매하며, 남는 사과는 버립니다)
예를 들어, k = 3, m = 4, 사과 7개의 점수가 [1, 2, 3, 1, 2, 3, 1]이라면, 다음과 같이 [2, 3, 2, 3]으로 구성된 사과 상자 1개를 만들어 판매하여 최대 이익을 얻을 수 있습니다.
- (최저 사과 점수) x (한 상자에 담긴 사과 개수) x (상자의 개수) = 2 x 4 x 1 = 8
사과의 최대 점수 k, 한 상자에 들어가는 사과의 수 m, 사과들의 점수 score가 주어졌을 때, 과일 장수가 얻을 수 있는 최대 이익을 return하는 solution 함수를 완성해주세요.
제한사항
- 3 ≤ k ≤ 9
- 3 ≤ m ≤ 10
- 7 ≤ score의 길이 ≤ 1,000,000
- 1 ≤ score[i] ≤ k
- 이익이 발생하지 않는 경우에는 0을 return 해주세요.
입출력 예

입출력 예 설명
입출력 예 #1
- 문제의 예시와 같습니다.
입출력 예 #2
- 다음과 같이 사과 상자를 포장하여 모두 팔면 최대 이익을 낼 수 있습니다.

따라서 (1 x 3 x 1) + (2 x 3 x 1) + (4 x 3 x 2) = 33을 return합니다.
코드 설명
방법1
import java.util.Arrays;
import java.util.Scanner;
public class Solution {
public int solution(int k, int m, int[] score) { // ex) score = [1, 2, 3, 1, 2, 3, 1], m = 4, k = 3
int answer = 0;
int index = 0;
Arrays.sort(score); // 1. score배열을 정렬 해주고, [1, 1, 1, 2, 2, 3, 3]
int[] tScore = new int[score.length];
for (int i = 0; i < tScore.length; i++) { // 2. tScore배열에 score배열을 정렬한 부분을 오름차순으로 저장해준다.
tScore[i] = score[score.length - 1 - i]; // [3, 3, 2, 2, 1, 1, 1]
}
while(true) {
if (index >= tScore.length || index + m > tScore.length) { // 3. index가 tScore길이랑 같거다 크면 멈추고, index + m이 tScore길이보다 크면 멈춤
break;
}
answer += tScore[index + m - 1] * m; // 4. answer에 tScore[index + m -1]값 * m을 해서 더해줌.
index += m; // 5. wile문 한번 돌때마다 index에 m을 더해줌.
}
// tScore[index + m - 1] * m = tScore[3] * 4 = 8
// index = 4
// index + m의 값이 tScore의 길이보다 크니까 종료.
return answer;
// ex) k = 4, m = 3, score = [4, 1, 2, 2, 4, 4, 4, 4, 1, 2, 4, 2]
// 1. [1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4]
// 2. [4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 1, 1] tScore.length = 12
// 3. 해당X
// 4. tScore[0 + 3 - 1] * m = tScore[2] * 3 = 4 * 3 = 12 answer = 12
// 5. index = 3
// 3. 해당X
// 4. tScore[3 + 3 - 1] * m = tScore[5] * 3 = 4 * 3 = 12 answer = 24
// 5 = index = 6
// 3. 해당X
// 4. tScore[6 + 3 - 1] * m = tScore[8] * 3 = 2 * 3 = 6 answer = 30
// 5 = index = 9
// 3. 해당X
// 4. tScore[9 + 3 - 1] * m = tScore[11] * 3 = 1 * 3 = 3 answer = 33
// 5. index = 12
// 3. 12 >= 12 이므로 종료.
// answer = 33
}
public static void main(String[] args) {
Solution T = new Solution();
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
int m = sc.nextInt();
int num = sc.nextInt();
int[] score = new int[num];
for (int i = 0; i < num; i++) {
score[i] = sc.nextInt();
}
System.out.println(T.solution(k, m, score));
sc.close();
}
}
방법2
public int solution(int k, int m, int[] score) { // ex) k = 4, m = 3, score = [4, 1, 2, 2, 4, 4, 4, 4, 1, 2, 4, 2]
int answer = 0;
Arrays.sort(score); // [1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4]
for (int i = score.length; i >= m; i -= m) {
answer += score[i - m] * m;
}
// i = 12; 12>= 3; 12 -= 3
// answer += score[9] * 3 = 4 * 3 = 12
// i = 9; 9 >= 3; 9 -= 3
// answer += score[6] * 3 = 4 * 3 = 12
// i = 6; 6 >= 3; 6 -= 3
// answer += score[3] * 3 = 2 * 3 = 6
// i = 3; 3 >= 3; 3 -= 3
// answer += score[0] * 3 = 1 * 3 = 3
// answer = 33
return answer;
}
728x90
'알고리즘' 카테고리의 다른 글
[Java] 프로그래머스 햄버거 만들기 (0) | 2023.02.07 |
---|---|
[Java] 프로그래머스 푸드 파이터 대회 (0) | 2023.02.07 |
[Java] 프로그래머스 기사단원의 무기 (0) | 2023.02.06 |
[Java] 프로그래머스 명예의 전당 (1) [우선순위 큐(Priority Queue) 사용 및 설명] (0) | 2023.02.06 |
[Java] 프로그래머스 문자열 나누기 (0) | 2023.02.06 |