다리가 버틸수있는 범위 내에서 계속 트럭을 넘기면 되는 문제이다. 주의해야할점은 트럭을 먼저 다리에 들여보내지않고 내보내야한다는 점이다.
#include <string>
#include <vector>
#include <deque>
using namespace std;
int solution(int bridge_length, int weight, vector<int> truck_weights)
{
int answer = 0, bridge_weight = 0;//걸린 시간, 현재 다리위 무게
deque<int> wait;//대기중인 트럭
deque<pair<int,int>> bridge;//다리위 트럭
for(auto c : truck_weights) wait.push_back(c);
while (!wait.empty() || !bridge.empty())//대기중이거나 다리위에 트럭이 있다면
{
if (!bridge.empty() && bridge.front().second == bridge_length)
{// 다리위 트럭이 다리를 다 지나갔다면
bridge_weight -= bridge.front().first;//다리위 무게에서 해당 무게를 빼줌
bridge.pop_front();
}
if (!wait.empty() && bridge_weight + wait.front() <= weight)
{// 다리에 올려도 된다면
bridge.push_back({wait.front(),0});
bridge_weight += wait.front();
wait.pop_front();
}
for(int i=0;i<bridge.size();i++) bridge[i].second++;// 트럭 이동
answer++;
}
return answer;
}