https://school.programmers.co.kr/learn/courses/30/lessons/150369
구현 아이디어 2분 구현 25분
코딩테스트는 반례 찾기가 가장 어려운 듯... 스택을 활용하여 풀었다.
#include <string>
#include <vector>
#include <stack>
using namespace std;
long long solution(int cap, int n, vector<int> deliveries, vector<int> pickups) {
long long answer = 0;
stack<int> delivery;
stack<int> pickup;
for(int i = 0; i < n; ++i)
{
delivery.push(deliveries[i]);
pickup.push(pickups[i]);
}
while(!delivery.empty() || !pickup.empty())
{
// 배달부터 꺼내자.
while(!delivery.empty())
{
if(delivery.top() == 0) delivery.pop();
else break;
}
int tmp = cap;
long long dist_delivery = delivery.size();
while(true)
{
// tmp가 0이거나 배달할 집이 없다면 break.
if(tmp == 0 || delivery.empty()) break;
int& numDel = delivery.top();
if(numDel != 0)
{
--tmp;
--numDel;
}
if(numDel == 0) delivery.pop();
}
// 수거.
while(!pickup.empty())
{
if(pickup.top() == 0) pickup.pop();
else break;
}
tmp = cap;
long long dist_pickup = pickup.size();
while(true)
{
// tmp가 0이거나 배달할 집이 없다면 break.
if(tmp == 0 || pickup.empty()) break;
int& numPick = pickup.top();
if(numPick != 0)
{
--tmp;
--numPick;
}
if(numPick == 0) pickup.pop();
}
answer += (max(dist_delivery, dist_pickup) * 2);
}
return answer;
}