[코테] 프로그래머스 스택/큐 다리를 지나는 트럭

홍인열·2022년 2월 16일
0
post-custom-banner

문제

트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 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;
}
profile
함께 일하고싶은 개발자
post-custom-banner

0개의 댓글