이 문제의 핵심은 출발 시간입니다.
'마지막 트럭의 출발시간 + (bridge_length / 1)'이 모든 트럭이 도착한 시간이 된다는 것을 빠르게 알아차리는게 중요합니다.
아래는 그것의 구현입니다.
더보기
#include <string>
#include <vector>
#include <queue>
using namespace std;
int solution(int bridge_length, int weight, vector<int> truck_weights) {
int answer = 0;
queue<int> onBridgeTruck; // 다리 위 트럭의 무게들입니다.
queue<int> truckStartT; // 트럭이 다리에 진입한 시간입니다.
int startTime = 0; // 출발시간입니다.
int sumWeight = 0; // 다리 위 트럭 무게의 합입니다.
int culTruckIndex = 0;
// 마지막 트럭이 출발하면 탈출합니다.
while(culTruckIndex < truck_weights.size()) {
startTime += 1;
// 트럭이 도착한 경우 트럭을 빼줍니다.
int frontTruckStart = truckStartT.front();
if(startTime - frontTruckStart == bridge_length) {
sumWeight -= onBridgeTruck.front();
onBridgeTruck.pop();
truckStartT.pop();
}
// 다리 위의 트럭 무게와 후보 트럭 무게가 동일하다면, 다리에 올려줍니다.
int culTruckWeight = truck_weights[culTruckIndex];
if(sumWeight + culTruckWeight <= weight) {
onBridgeTruck.push(culTruckWeight);
truckStartT.push(startTime);
culTruckIndex += 1;
sumWeight += culTruckWeight;
}
}
// 마지막 트럭 출발 시간과 (다리 길이 / 속력)은 모든 트럭이 이동을 완료한 시간입니다.
answer = startTime + bridge_length;
return answer;
}
'알고리즘 > 보여주기식 문제풀기' 카테고리의 다른 글
1300 - K번째 수 (0) | 2020.04.14 |
---|