[프로그래머스] 과일 장수

2024. 7. 11. 14:19코딩테스트

https://school.programmers.co.kr/learn/courses/30/lessons/135808

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명
과일 장수가 사과 상자를 포장하고 있습니다. 사과는 상태에 따라 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 ≤ 93 ≤ m ≤ 107 ≤ 
score의 길이 ≤ 1,000,0001 ≤ score[i] ≤ k
이익이 발생하지 않는 경우에는 0을 return 해주세요.

 

socre 배열을 정렬하고, 상자에 담을 수 있는 m의 길이만큼 잘라서 비교한다. 새로운 상자 배열을 만들어 값을 넣는다. 이때 가장 뒷순으로 되어 있는 socre 배열 값을 순서대로 넣어준다. (오름차순으로 정렬되어 있어 마지막에 값을 더할 때 편하게 할 수 있다.)

 

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int solution(int k, int m, vector<int> score) {
    int answer = 0;
    
    int divi = score.size() / m;
    
    sort(score.begin(),score.end());
    
    for(int i=0;i<divi;i++)
    {
        int count = (score.size()-1)-(i*m);
        
        vector<int> box;
        
        for(int j = count; j>count-m;j--)
        {
            box.push_back(score[j]);
        }
        answer+= box[box.size()-1] * m;
    }
                                                                 
    return answer;
}

 

첫번째 for문은 divi라는 담을 수 있는 상자의 갯수만큼 계산한 뒤에 해당 수만 큼만 반복되도록 설정한다.

count의 값은 i번째 상자가 늘어날 때마다 score에서 가져와야 할 위치가 줄어들어야 하기 때문에 그에 맞게 count를 계산한다.