[Programmers] Level2 : 다리를 지나는 트럭
Question
Solution
- 다리 위의 트럭을 queue에 담는다. q.empty()면 모든 트럭이 통과했다고 간주한다.
- 다리 위의 트럭의 경과 시간을 관리할 runtime[10001]을 선언한다.
- 경과 시간 answer에 따라 while을 돌리고 q에 있는 트럭들의 runtime을 증가시킨다.
이 때 트럭의 runtime이 다리의 길이와 같아지면 트럭은 통과했다고 볼 수 있다. - (다리의 무게 - 다리 위의 트럭 무게의 합) > 0 이면,
이 차보다 같거나 같은 트럭이 다음 대기 순번에 있다면 다리 위로 올린다.
Cord
#include <vector>
#include <queue>
using namespace std;
int runtime[10001]; // 다리위 트럭의 경과 시간
// 다리 위 트럭의 무게 합
int sumWeightOnBridge(queue<int> q, vector<int>& truck_weights)
{
int sum = 0;
while (!q.empty())
{
int idx = q.front();
q.pop();
sum += truck_weights[idx];
}
return sum;
}
// 다리 위 트럭의 경과 시간 증가
void runningTime(queue<int>& q, int bridge_length)
{
queue<int> copyQ = q;
// 트럭 각각의 경과 시간 증가
while (!copyQ.empty())
{
int idx = copyQ.front();
copyQ.pop();
runtime[idx] += 1;
}
// 가장 먼저 출발한 트럭이 다리를 건넜는지 확인
if (!q.empty() && runtime[q.front()] >= bridge_length) { q.pop(); }
}
int solution(int bridge_length, int weight, vector<int> truck_weights)
{
int answer = 1;
int nextIdx = 0;
queue<int> q; // 출발한 다리위 트럭
q.push(nextIdx); // 가장 처음의 트럭 Idx
nextIdx++;
while (!q.empty())
{
answer++; // 시간의 경과
runningTime(q, bridge_length); // 다리 위 트럭의 시간 경과
int diff = weight - sumWeightOnBridge(q, truck_weights); // 다리 무게와 다리 위 트럭의 무게 합의 차
// diff의 무게가 남고 다음 트럭이 이보다 작거나 같을때 추가 시키기
if (nextIdx < truck_weights.size() && 0 < diff && truck_weights[nextIdx] <= diff)
{
q.push(nextIdx);
nextIdx++;
}
}
return answer;
}