
문제 설명
과일 장수가 사과를 한 상자에 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;
}
'Algorithm Study' 카테고리의 다른 글
[프로그래머스] 1단계 - 가장 가까운 같은 글자 (0) | 2023.12.26 |
---|---|
[프로그래머스] 2단계 - 최댓값과 최솟값 (0) | 2023.12.22 |
[프로그래머스] 0단계 - 안전지대 (0) | 2023.12.22 |
[프로그래머스] 0단계 - 겹치는 선분의 길이 (0) | 2023.12.22 |
[프로그래머스] 0단계 - 평행 (0) | 2023.12.20 |