[programmers]ブリッジトラック
問題の説明
何台ものトラックが規定の順序で川の橋を渡りたいと思っています.すべてのトラックが橋を渡るのに少なくとも数秒かかります.トラックは毎秒1移動し、橋の長さはbridge lengthで、足は重量に耐えられる.
※トラックが橋に完全に上がっていない場合は、トラックの重量は考慮しません.
solution関数のパラメータは、ブリッジ長bridge length、足が受ける重量、トラック1台あたりの重量cart weightsである.解の関数を完了し、すべてのトラックが橋を渡るのに少なくとも数秒かかります.
せいげんじょうけん
ソースコード
C++
#include <string>
#include <vector>
#include <queue>
using namespace std;
int solution(int bridge_length, int weight, vector<int> truck_weights) {
int answer = 0;
int sum = 0, idx = 0;
queue<int> q;
while(1) {
answer++;
// 큐의 길이와 다리의 길이가 같으면 트럭이 도착한 것
if(q.size() == bridge_length) {
sum -= q.front();
q.pop();
}
// 다음 트럭이 다리를 지나갈 수 있으면
// 다음 트럭의 무게를 더한 합이 다리의 무게보다 작으면, 트럭 push
if(sum + truck_weights[idx] <= weight) {
// 마지막 트럭이면 마지막 트럭의 길이만큼 시간을 더해준다.
if(idx == truck_weights.size()-1) {
answer += bridge_length;
break;
}
q.push(truck_weights[idx]);
sum += truck_weights[idx];
idx++;
}
// 다음 트럭의 무게를 더한 합이 다리의 무게보다 크면 0을 push해
// 트럭의 도착 시간을 맞춰준다.
else {
q.push(0);
}
}
return answer;
}
Java
import java.util.*;
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
int answer = 0;
int sum = 0, i = 0;
Queue<Integer> q = new LinkedList<>();
for(int truck : truck_weights) {
while(true) { // 트럭 올릴 때 까지 반복
answer += 1;
// 큐가 비어있으면 다리에 트럭 올림.
if(q.isEmpty()) {
q.add(truck);
sum += truck;
break;
}
// 다리에 트럭이 최대로 올라가면 큐에서 제거
if(q.size() == bridge_length) {
sum -= q.poll();
}
// 다리에 트럭 더 올릴 수 있으면 큐에 추가
if(sum + truck <= weight) {
q.add(truck);
sum += truck;
break;
}
// 못 올리면 0 추가
else {
q.add(0);
}
}
}
return answer + bridge_length;
}
}
感想
ポイントは0を押すことです.
そして、最後のトラックに時間を追加!!
Reference
この問題について([programmers]ブリッジトラック), 我々は、より多くの情報をここで見つけました https://velog.io/@minwest/Programmers-다리를-지나는-트럭テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol