본문 바로가기

프로그래머스/스택, 큐

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

반응형

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/42583

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

2. 코드

다리 위에 올라가 있는 트럭은 무조건 한 칸씩 앞으로 간다. 새로 올리고 싶은 트럭 + 다리 위 트럭의 총 무게 <= weight 이거나 아니거나에 따라 트럭을 추가로 올릴지 말지 결정하는 것, 이것에 대한 분기처리만 필요한 것이다.

function solution(bridge_length, weight, truck_weights) {
    // 시간
    let count = 0;
    // 큐. 다리에 올라갈 수 있는 최대 트럭 갯수만큼 배열을 만들어주고, 요소의 값을 0으로 채움
    let queue = new Array(bridge_length).fill(0);
    // 다리에 올라가있는 트럭 무게의 총 합
    let totalWeight = 0;
    
    // 처음 올라가는 트럭. 앞이 출구 뒤가 입구.
    let currentTruck = truck_weights.shift();
    queue.push(currentTruck);
    queue.shift();
    totalWeight += currentTruck;
    count++;
    
    // 큐의 데이터 합이 0이 될 때까지 반복
    while(totalWeight){
        // 1. 큐 요소들을 한 칸 앞으로 옮긴 후
        totalWeight -= queue.shift();
        currentTruck = truck_weights.shift();
        // 2-1. currentTruck의 무게와 현재 다리 위에 있는 트럭의 총 무게의 합이 weight보다 작거나 같다면
        if(currentTruck + totalWeight <= weight){
           // 다리에 트럭 하나 더 추가
            queue.push(currentTruck);
            totalWeight += currentTruck;
        }// 2-2. currentTruck의 무게와 현재 다리 위에 있는 트럭의 총 무게의 합이 weight보다 크다면
        else{
            // 큐 길이 원상복구('큐 길이 = 다리 길이' 유지되어야하기 때문)
            truck_weights.unshift(currentTruck);
            queue.push(0);
        }
        count++;
    }
    
    return count;
}

 

복기

4/14
반응형