해당 문제는 큐 자료구조에 대한 기초적인 이해를 필요로합니다.
당신은 세금처리를 위해 은행에 와 있습니다. 대기표를 뽑고 먼저 온 사람들의 업무가 끝날때까지 기다렸다가, 전광판에 자신의 번호가 나와서야 업무를 처리할 수 있죠. 당신보다 늦게 온 사람이 먼저 불려나가는 일은 좀처럼 없습니다. 이처럼 먼저 들어온 것이 먼저 나가는 방식을 FIFO(First In First Out)라고 부르고, 이것의 대표격이 바로 큐(Queue)알고리즘입니다.
저는 문제의 순서를 3단계로 나누었습니다
1.트럭이 존재한다면, 모든 트럭을 한칸씩 땡긴다.
2.만약 다리에 트럭이 존재하지 않고, 대기 트럭이 없을 경우 진행된 시간을 리턴.
3.다리에 존재한느 모든 트럭의 무게 + 대기 트럭의 첫번째의 무게가 다리의 무게제한보다 같거나 작을 경우, 맨 앞에 있는 대기트럭을 다리에 올림.
이것을 반복하는 것으로 문제를 해결했습니다.
#include <string>
#include <vector>
using namespace std;
bool on_truck(vector<int> bridge)//트럭이 올라와있는지 검사
{
int i = 0;
while (i < bridge.size())
{
if (bridge[i] > 0)
return true;
i++;
}
return false;
}
void move_truck(vector<int>* bridge)//트럭을 한칸씩 땡기는 함수.
{
int i = 0;
while (i < bridge->size() - 1)
{
(*bridge)[i] = (*bridge)[i + 1];
i++;
}
(*bridge)[i] = 0;
}
int on_truck_weight(vector<int> bridge)//다리에 있는 모든 트럭의 무게를 리턴.
{
int i = 0;
int weight = 0;
while (i < bridge.size())
{
weight += bridge[i];
i++;
}
return weight;
}
int solution(int bridge_length, int weight, vector<int> trucks) {
int answer = 0;
int time = 0;
vector<int> bridge(bridge_length);
while (true)
{
if (on_truck(bridge))
move_truck(&bridge);
else if (trucks.size() < 1)
return time;
if (trucks.size() > 0 && (on_truck_weight(bridge) + trucks.front()) <= weight)
{
bridge.back() = trucks.front();
trucks.erase(trucks.begin());
}
time++;
}
return time;
}