프로그래머스 LV2 #1 다리를 지나가는 트럭
코딩테스트 문제는 문제의 조건에 따라 정리하는게 중요하다고 생각합니다.
최대한 문제를 간단하게 만들어보면,
저는 while
문을 활용하여 모든 트럭이 지나갔고, 다리에 아무런 트럭이 없으면 반복을 끝내도록 하였습니다.
트럭은 오브젝트로 취급하였으며 각각이 truck_weight: 트럭의 무게
와 time: 다리에 머무른 시간
을 가지도록 하였습니다.
매 loop의 시작마다 트럭은 다리위에서 머문 시간인 time
의 값을 1씩 늘려갑니다.
이후에 트럭이 다리 위에 올라갈 수 있는지에 대해 조건식으로 확인한 뒤 트럭이 다리에 올라갈 수 있으면, 트럭을 올립니다. 트럭이 올라가게 되면, 대기중인 트럭에서 삭제되며, 다리 위의 상주 시간은 0
으로 세팅됩니다.
let solution = (bridge_length, weight, truck_weights) => {
let counter = 0; // 사이클 횟수를 세는 용도
let trucksOnBridge = []; // 다리 위에 있는 트럭을 가질 배열
while(truck_weights.length !== 0 || trucksOnBridge.length !== 0){ // 다리 위에 트럭이 있거나 대기중인 트럭이 있다면 반복
trucksOnBridge = trucksOnBridge.map((t) => ({"truck_weight": t["truck_weight"], "time":t["time"]+=1})); // 트럭의 다리 위 상주시간을 1 늘림
trucksOnBridge = trucksOnBridge.filter((t) => t["time"] < bridge_length); // 다리 위의 상주시간이 다리 길이보다 작은 것들만 남김 (나머지는 다리를 건넌 것)
// 다리 위에 올라갈 수 있는지 확인 후, 자리가 있다면 올림
if(truck_weights.length !== 0 && (trucksOnBridge.reduce((a, c)=> +a + +c["truck_weight"], 0) + truck_weights[0]) <= weight ) trucksOnBridge.push({"truck_weight": truck_weights.splice(0, 1), "time": 0});
counter++;
}
return counter;
}