코딩테스트 연습/programmers
[Programmers] 스택/큐 > 다리를 지나는 트럭
수기
2022. 4. 1. 02:28
스택/큐 - 다리를 지나는 트럭
https://programmers.co.kr/learn/courses/30/lessons/42583
코딩테스트 연습 - 다리를 지나는 트럭
트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈
programmers.co.kr
queue로 선언한 q에다 truck_weights입력을 넣어두고 시작한다.
for(int i=1; i != q.empty() ; i++ ) 여기서 i는 경과 시간으로 생각한다.
weight보다 time벡터 원소의 모든합(t)이 작을때만 q를 push할 수 있다.
index에는 time에 q 원소가 언제 들어왔는지를 저장한다.
q 원소는 bridge_length 시간동안만 존재할 수 있으므로 bridge_length 값과 i-index.front()이 같을때는 time에서 q원소를 제거한다. 마찬가지로 index도 함께 제거한다.
마지막 경과시간은 마지막으로 들어온 시간(i)으로부터 bridge_length-1를 더해주면 구할 수 있다.
코드
#include <string>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
int solution(int bridge_length, int weight, vector<int> truck_weights) {
int answer = 0;
queue<int> q;
vector<int> time;
vector<int> index;
for(int i=0;i<truck_weights.size();i++) q.push(truck_weights[i]);
index.push_back(1);
for(int i=1; i != q.empty() ; i++ ){
if(q.empty()) return i+=(bridge_length-1);
if(bridge_length == i-index.front()) { //time은 bridge_length의 시간초만큼 존재, 그이후는 erase
index.erase(index.begin());
time.erase(time.begin());
}
int t=0;
for(int j=0;j<time.size();j++)t += time[j];
if(t+q.front() <= weight) { // //weight보다 time모든합 (t)가 작을때만 push
time.push_back(q.front());
if (i!=1) index.push_back(i);
q.pop();
}
}
return answer;
}
int main(int argc, const char *argv[])
{
int bridge_length, weight;
vector<int> truck_weights;
bridge_length = 2;
weight = 10;
truck_weights.push_back(7);
truck_weights.push_back(4);
truck_weights.push_back(5);
truck_weights.push_back(6);
// truck_weights.push_back(1);
// truck_weights.push_back(1);
// truck_weights.push_back(1);
// truck_weights.push_back(1);
// truck_weights.push_back(1);
// truck_weights.push_back(2);
// truck_weights.push_back(2);
//
// bridge_length = 5;
// weight = 5;
solution(bridge_length,weight, truck_weights);
return 0;
}