반응형
접근
이번 문제는 신경써야할 부분이 많았고 처음에 읽을 때 바로 이해가 되지 않았다.
결론적으로 다리가 수용할 수 있는 무게와 트럭이 어디에 위치해 있는지 등을 신경 써주어야 한다. 그래야 다음 트럭이 언제 다리에 진입할 수 있는지 알 수 있다.
대략적인 흐름은 아래와 같다.
다리에 있는 트럭을 한 칸씩 앞으로 이동한다.
현재 다리에 있는 트럭들의 무게와 대기 중인 트럭 무게의 합이 수용 가능한 다리의 무게 보다 작거나 같다면
대기 중인 트럭 진입 아니라면 진입 안함
function solution(bridge_length, weight, truck_weights) {
var answer = 0, truckOnTheBridge = {},finishedTruck=0;
let idx = 0, curWeight=0;
// 다리를 지난 트럭과 대기 트럭의 갯수가 같으면 트럭이 모두 지나간 것이기 때문에 끝
while(truck_weights.length != finishedTruck){
//경과시간 1추가
answer++;
// 다리 위에 트럭이 있다면 1칸씩 이동
for( let key in truckOnTheBridge){
truckOnTheBridge[key]+=1;
// 다리 위에 트럭이 다리를 지났다면 트럭을 다리에서 삭제
if(truckOnTheBridge[key] == bridge_length+1){
delete truckOnTheBridge[key];
let i = Number(key);
curWeight -= truck_weights[i];
finishedTruck +=1;
}
}
let curTruckW = truck_weights[idx];
// 현재 다리 위에 있는 트럭의 무게 더하기 현재 추가 할 트럭의 무게가 다리가 버틸 수 있는 무게인지 확인
if(curWeight+curTruckW <= weight){
curWeight += curTruckW;
// map에 idx를 key로 0은 value ex) {0:1,}
// 후위 연산이기 때문에 map에 값 대입하고 idx+=1이 수행됌
truckOnTheBridge[idx++]=1;
}
}
return answer;
}