Queue를 사용하는 문제이다.
문제에서 주어진 대로 트럭이 다리를 지나가는 과정을 구현하면 된다.
현재 차례의 트럭이 다리의 최대 무게 때문에 못 지나가는 경우, 무게가 0인 트럭을 지나가게 하도록 대체 할 수 있다.
핵심 while 문 내부 코드 분석
if(weightSum + now_weight <= weight){
weightSum += now_weight;
que.push(now_weight);
i++;
}
else que.push(0);
time++;
while문 내의 가장 아랫부분에 있는 코드이다.
이 부분을 제일 먼저 만들었다.
현재 다리에 있는 트럭 무게의 합과 현재 차례의 트럭 무게의 합이 허용 무게 이하라면,
무게의 합을 갱신하고,
queue에 트럭을 push하고,
트럭의 차례를 넘겨준다(i++)
1번 반복할 때마다 반드시 1초의 시간이 흐른다.
if(que.size() == bridge_length){
weightSum -= que.front();
que.pop();
}
현재 다리에 실제 트럭을 넣을 지, 무게가 0인 트럭을 넣을 지 고민하기 전에
현재 다리가 꽉 차있는지 확인해야한다.
만약 다리가 가득차있다면 가장 앞에있는 트럭 하나를 방출시킨다.
if(i == truck_weights.size()){
time += bridge_length;
break;
}
마지막 트럭까지 다리에 올렸다면 이제 종료해야한다.
마지막 트럭이 다리의 첫 번째 위치에 있을 것이기 때문에 마지막 트럭이 빠져나가기 위해서 다리의 길이만큼의 시간이 필요하다.
다리 길이만큼 시간을 더해주고 while문을 빠져나간다.
최종 코드
#include <string>
#include <vector>
#include <queue>
using namespace std;
int solution(int bridge_length, int weight, vector<int> truck_weights) {
int time = 0;
queue<int> que;
int weightSum = 0;
int i = 0;
while(true){
int now_weight = truck_weights[i];
if(i == truck_weights.size()){
time += bridge_length;
break;
}
if(que.size() == bridge_length){
weightSum -= que.front();
que.pop();
}
if(weightSum + now_weight <= weight){
weightSum += now_weight;
que.push(now_weight);
i++;
}
else que.push(0);
time++;
}
return time;
}
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스 level2] 피로도 (C++) (0) | 2022.02.22 |
---|---|
[프로그래머스 level2] H-index (C++) (0) | 2022.02.22 |
[프로그래머스] level2 순위 검색 (Python) (0) | 2022.01.26 |
[프로그래머스] level2 전화번호 목록 (C++) (0) | 2022.01.18 |
[프로그래머스] level2 단체사진 찍기 (C++) (0) | 2022.01.18 |