문제 설명

과일 장수가 사과를 한 상자에 m개씩 담아 포장하고 있고, 상자에 담긴 사과 중 가장 낮은 점수가 p인 경우 사과 한 상자의 가격은 p * m이다

과일 장수가 가능한 많은 사과를 팔았을 때, 얻을 수 있는 최대 이익은?

(사과는 상자 단위로만 판매하며, 남는 사과는 버림)

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

 

프로그래머스

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

programmers.co.kr

 

문제 풀이법

우선 사과 벡터를 오름차순으로 정렬을 한다

이후 for문을 돌며 사과의 가격이 제일 큰 순으로(즉, 벡터의 끝부터) m개씩 나눠가며 사과 상자의 값을 책정한다

 

변수 n은 인덱스를 나타낸다

for문을 돌면서도 순서대로 인덱스를 가리키도록 설정했기 때문에, 만일 사과의 개수가 8개라면 n은 7, 6, 5.....0을 가리킨다

 

가장 바깥의 for문은 나올 수 있는 사과 상자의 갯수만큼 반복하고, 안쪽의 for문은 한 상자에 담기는 사과의 수인 m번만큼 반복한다

안쪽의 for문을 돌면서 가장 점수가 낮은 사과의 점수를 체크하고, 안쪽 for문을 다 돌면 해당 사과 박스 가격을 책정한다

안쪽의 for문을 돌기 전,  m보다 남는 사과가 적을 경우 break을 통해 for문을 빠져나온다

 

 

소스 코드

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int solution(int k, int m, vector<int> score) {
    int answer = 0;
    
    sort(score.begin(), score.end());
    
    int len = score.size();
    
    for (int i = 0; i < (len / m + 1); i++) {
        int box_size = 0;
        int min_score = 10;
        
         if (len - (i * m) < m)
            break;
        
        for (int j = 0; j < m; j++) {
            int n = len - (i * m) - j - 1;
            if (n >= 0) {
                if (min_score > score[n])
                    min_score = score[n];
                box_size++;
            }
        }
        
        answer += (min_score * box_size);
    }
    
    return answer;
}
복사했습니다!