상당히 많이 해맸고 개인적으로 어려웠던 문제이다. 여러번 잘못 생각해서 풀이도 난잡해지고 결과도 이상해졌다. 필자의 풀이는 좀 별로인듯 하여 다른코드 또한 첨부한다.
#include <string>
#include <vector>
using namespace std;
long long solution(int cap, int n, vector<int> deliveries, vector<int> pickups)
{
long long deli_sum = 0;
long long pick_sum = 0;
for(auto d : deliveries) deli_sum += d;
for(auto p : pickups) pick_sum += p;
long long answer = 0;
int longest = n-1;
while(deli_sum > 0 || pick_sum > 0)
{
int c1 = cap, c2 = cap;
int dist1 = 0, dist2 = 0;
for(int i=longest; i>=0; i--)
{
if(deliveries[i] > 0 && c1 > 0)
{
dist1 = i > dist1 ? i : dist1;
while(c1 > 0 && deliveries[i] > 0)
{
c1--; deliveries[i]--; deli_sum--;
}
}
if(pickups[i] > 0 && c2 > 0)
{
dist2 = i > dist2 ? i : dist2;
while(c2 > 0 && pickups[i] > 0)
{
c2--; pickups[i]--; pick_sum--;
}
}
if(c1==0 && c2==0) break;
}
if(deliveries[longest] == 0 && pickups[longest] == 0) longest=max(dist1, dist2);
answer += max(dist1+1, dist2+1) * 2;
}
return answer;
}
좋은 코드
#include <string>
#include <vector>
using namespace std;
long long solution(int cap, int n, vector<int> deliveries, vector<int> pickups)
{
long long answer = 0;
int del = 0, pic = 0;
for (int i = n - 1; i >= 0; i--)
{
if (deliveries[i] != 0 || pickups[i] != 0)
{
long long cnt = 0;
while (del < deliveries[i] || pic < pickups[i])//가능개수보다 크다면 cap만큼 더해줌
{
cnt++;
del += cap;
pic += cap;
}
del -= deliveries[i];//배달가능개수
pic -= pickups[i];//수거가능개수
answer += cnt * (i + 1) * 2;
}
}
return answer;
}