[프로그래머스] 다리를 지나는 트럭 javascript

[스택/큐] level2 다리를 지나는 트럭

javascript

조건
1. 트럭은 1초에 1만큼 움직이며, 다리 길이는 bridge_length이고 다리는 무게 weight까지 견딥니다.
2. 트럭이 다리에 완전히 오르지 않은 경우, 이 트럭의 무게는 고려하지 않습니다.

제한사항
  • bridge_length는 1 이상 10,000 이하입니다.
  • weight는 1 이상 10,000 이하입니다.
  • truck_weights의 길이는 1 이상 10,000 이하입니다.
  • 모든 트럭의 무게는 1 이상 weight 이하입니다.

입출력 예
경과 시간다리를 지난 트럭다리를 건너는 트럭대기 트럭
0[][][7,4,5,6]
1~2[][7][4,5,6]
3[7][4][5,6]
4[7][4,5][6]
5[7,4][5][6]
6~7[7,4,5][6][]
8[7,4,5,6][][]

코드

/**
*@param bridge_length 다리 길이
*@param weight 다리가 버티는 무게(하중)
*@param truck_weights 다리를 건널 트럭들의 배열(value:트럭무게)
**/
function solution(bridge_length, weight, truck_weights) {
    let time = 0, //다리를 건너는 시간을 담는 변수 
        cross_trucks=[], //다리를 건너는 중인 트럭들의 배열({time,weight}, ...)
        copy_trucks = truck_weights.concat(), //truck_weights의 copy하여 대기트럭 배열로 사용(다리 진입 시 배열에서 제거)
        bridge_weight = 0; //현재 다리를 건너는 트럭 무게의 총 합(이 변수는 weight값보다 작거나 같아야한다)
    
    //경과시간을 나타내는 loop(대기 중인 트럭이 있거나 다리를 건너는 트럭이 있는 동안 시간을 체크한다)
    while(copy_trucks.length > 0 || cross_trucks.length > 0) {
        time++;
        const truck = copy_trucks[0]; //다리 진입 대기중인 하나의 트럭
        
        //다리를 지난 트럭 Logic
        if (cross_trucks[0] && (cross_trucks[0].time + bridge_length) === time) {
            bridge_weight -= cross_trucks.shift().weight; //다리를 건너는 트럭배열에서 제거 및 현재 건너는 트럭들의 무게에서 뺀다.
        }
        
        //다리를 건너는 트럭 Logic(현재 다리에 진입할려는 트럭이 건너는 트럭들의 무게와 더했을 때 weight보다 낮은 경우 진입)
        if (weight >= (bridge_weight + truck)) {
            bridge_weight += truck;
            cross_trucks.push({time:time, weight:truck}); //다리를 건너는 트럭 배열에 추가
            copy_trucks.shift(); //대기트럭 배열에서 제거
        }
        
    }
    
    return time;
}

댓글