트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈 수 있으며, 다리는 weight 이하까지의 무게를 견딜 수 있습니다. 단, 다리에 완전히 오르지 않은 트럭의 무게는 무시합니다.
function solution(bridge_length, weight, truck_weights) {
let time = 0;
let arrival = truck_weights.length;
//모든 트럭이 다리를 건널때까지 반복문
const onBridge = Array(bridge_length).fill(0) // 다리위에 자리를 나타내는 배열을 만든다.
let permitWeight = weight; // 허용 무게
const inBridge = () => { // 트럭이 다리위로 올라가는 함수
onBridge.push(truck_weights[0]);
permitWeight = permitWeight - truck_weights[0];
truck_weights.shift()
}
const outBridge =() => { // 다리위에 첫번째 인자가 다리에서 내려가는 함수, 트럭일경우 아닐경우
permitWeight = permitWeight + onBridge[0]
onBridge.shift()
if(onBridge[0]) { //트럭일 경우만 남은 트럭수 --
arrival--
}
}
// 반복문조건을 만들기위해 미리 트럭을 다리위에올린다.
onBridge.shift()
inBridge()
time++
while(arrival){
outBridge() //먼저 다리위에 첫번재 인자를 내린다.
if(permitWeight >= truck_weights[0]){ // 다음트럭이 올라올무게가된다면 함수실행
inBridge()
} else { // 다음트럭이 못오면 0을 올려준다.
onBridge.push(0)
}
time++ // 반복문 한번에 1초 추가
}
time++ // 해답이 1초가 부족해서 추가해줬고 코드를 아래와 같이 수정해서 빼게되는 부분.
return time;
}
function solution(bridge_length, weight, truck_weights) {
let time = 0;
let arrival = truck_weights.length;
const onBridge = Array(bridge_length).fill(0)
let permitWeight = weight;
const inBridge = () => {
onBridge.push(truck_weights[0]);
permitWeight = permitWeight - truck_weights[0];
truck_weights.shift()
}
const outBridge =() => {
permitWeight = permitWeight + onBridge[0]
//onBridge.shift() // 해당 메서드를 먼저실행하면서 한탬포 빠르게 완료되는 에러가 있었다.
if(onBridge[0]) {
arrival--
}
onBridge.shift() // 수정
}
onBridge.shift()
inBridge()
time++
while(arrival){
outBridge()
if(permitWeight >= truck_weights[0]){
inBridge()
} else {
onBridge.push(0)
}
time++
}
// time++ // outBridge 함수수정으로 필요가 없어짐.
return time;
}