본문 바로가기
Algorithm/프로그래머스

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

by 강깅꽁 2020. 7. 11.
반응형

접근

이번 문제는 신경써야할 부분이 많았고 처음에 읽을 때 바로 이해가 되지 않았다. 

결론적으로 다리가 수용할 수 있는 무게와 트럭이 어디에 위치해 있는지 등을 신경 써주어야 한다.  그래야 다음 트럭이 언제 다리에 진입할 수 있는지 알 수 있다.

 

대략적인 흐름은 아래와 같다.

다리에 있는 트럭을 한 칸씩 앞으로 이동한다.

현재 다리에 있는 트럭들의 무게와 대기 중인 트럭 무게의 합이 수용 가능한 다리의 무게 보다 작거나 같다면

대기 중인 트럭 진입 아니라면 진입 안함

 

function solution(bridge_length, weight, truck_weights) {
    var answer = 0, truckOnTheBridge = {},finishedTruck=0;
    let idx = 0, curWeight=0;
    // 다리를 지난 트럭과 대기 트럭의 갯수가 같으면 트럭이 모두 지나간 것이기 때문에 끝
    while(truck_weights.length != finishedTruck){
        //경과시간 1추가
        answer++;
        // 다리 위에 트럭이 있다면 1칸씩 이동
        for( let key in truckOnTheBridge){
            truckOnTheBridge[key]+=1;
            // 다리 위에 트럭이 다리를 지났다면 트럭을 다리에서 삭제
            if(truckOnTheBridge[key] == bridge_length+1){
                delete truckOnTheBridge[key];
                let i = Number(key);
                curWeight -= truck_weights[i];
                finishedTruck +=1;
            }
        }
        let curTruckW = truck_weights[idx];
        // 현재 다리 위에 있는 트럭의 무게 더하기 현재 추가 할 트럭의 무게가 다리가 버틸 수 있는 무게인지 확인
        if(curWeight+curTruckW <= weight){
            curWeight += curTruckW;
            // map에 idx를 key로 0은 value ex) {0:1,} 
            // 후위 연산이기 때문에 map에 값 대입하고 idx+=1이 수행됌
            truckOnTheBridge[idx++]=1;
        } 
    }
    return answer;
}