[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