본문 바로가기

자료구조&알고리즘/알고리즘-문제풀이

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

let bridge_length = 100;
let weight = 100;
let truck_weights = [10,10,10,10,10,10,10,10,10,10];

function solution(bridge_length, weight, truck_weights) {

    let answer = 0; // 경과시간

    const currentBridge = []; // 현재 다리 상태
    let currentWeight = 0;  // 현재 다리 무게
    let currentTruck = 0;   // 현재 다리에 있는 트럭

    // 다리길이 만큼 현재 다리 상태 0으로 채워서 초기화
    for (let i = 0; i < bridge_length; i++) {
        currentBridge.push(0);
    }
    // 다리 초기화 후 첫번째 트럭을 넣어준다
    currentTruck = truck_weights.shift();
    currentBridge.unshift(currentTruck);    // 다리 첫번째에 넣어주고 다리 길이를 맞춰주기 위해 pop
    currentBridge.pop();
    currentWeight += currentTruck;  // 무게 증가
    answer++;

    // 현재 다리 무게가 0이 될때까지 트럭 넣고 빼고 반복
    while (currentWeight) {
        currentWeight -= currentBridge.pop();   // 맨 뒤에 있던 요소가 다리를 벗어남

        // 대기중인 트럭에서 가장 앞에 있는 트럭 가져옴
        currentTruck = truck_weights.shift();
        // 대기중이었던 트럭이 다리에 올라 갈수 있는지 없는지 판별
        // 올라갈수 있으면 추가하고, 올라갈수 없으면 다시 대기 리스트로 넣고 0으로 채움
        if (currentWeight + currentTruck <= weight) {
            currentBridge.unshift(currentTruck);
            currentWeight += currentTruck;
        } else {
            currentBridge.unshift(0);
            truck_weights.unshift(currentTruck);
        }

        answer++;
    }
    
    return answer;

}

console.log(solution(bridge_length, weight, truck_weights));
반응형