본문 바로가기

알고리즘 문제풀이

[프로그래머스] 고득점 키트 - 스택/큐2

오늘 푼 문제

 

2. 다리를 지나는 트럭 / Lv.2 / 시간 :  38분

programmers.co.kr/learn/courses/30/lessons/42583?language=javascript

 

코딩테스트 연습 - 다리를 지나는 트럭

트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이

programmers.co.kr

1차

function solution(bridge_length, weight, truck_weights) {
    var answer = 0;
    let currentWeight = 0;
    let onBridge = [];
    
    while(true){
        answer++;
        onBridge.forEach(ob=>{ob.pos++});
        
        if(onBridge.length && onBridge[0].pos>bridge_length){
            let finished = onBridge.shift();
            currentWeight-=finished.weight;
        }
        
        let target = truck_weights[0];
        if(currentWeight+target<=weight){
            onBridge.push({weight : truck_weights.shift(), pos : 1})
            currentWeight+=target;
        }
        if(!truck_weights.length && !onBridge.length) break;
    }
    
    return answer;
}

 

2차 (중복되는 조건 분기와 무의미한 반복을 줄임)

function solution(bridge_length, weight, truck_weights) {
    var answer = 1;
    let currentWeight = 0;
    let onBridge = [];
    
    while(truck_weights.length || onBridge.length){
        let target = truck_weights[0];
        if(currentWeight+target<=weight){
            answer++;
            onBridge.forEach(ob=>{ob.pos++});
            onBridge.push({weight : truck_weights.shift(), pos : 1})
            currentWeight+=target;
        }else{
            let jump = bridge_length - onBridge[0].pos;
            answer+=jump;
            onBridge.forEach(ob=>{ob.pos+=jump});
        }
        
        if(onBridge[0].pos===bridge_length){
            let finished = onBridge.shift();
            currentWeight-=finished.weight;
        }
    }
    
    return answer;
}

 

 

 

1,2차 시간 비교 결과 : 다리의 길이가 길어져도 1ms대에서 처리 가능해짐

좌 : 1차 / 우 : 2차