Today I Learned

[프로그래머스] 스택/큐 Level 2. 다리를 지나는 트럭(JAVA) 본문

알고리즘 & 코딩테스트

[프로그래머스] 스택/큐 Level 2. 다리를 지나는 트럭(JAVA)

하이라이터 2021. 2. 3. 02:43
728x90

처음에는 진입한 트럭의 Index로 이루어진 Queue와 <Index, weight>인 Hash, <Index, position>인 Hash를 만들어서 현재 다리 위에 있는 각 트럭의 무게와 위치를 전부 추적하려했는데 소스가 너무 복잡하고 무거워질거같았다.

 

그래서 진입한 시점의 시간 값으로 Queue를 만들면 어떨까 생각해봤다.

트럭의 위치값을 대신해서 현재 시간과 진입 시간으로 현재 트럭의 위치를 계산할 수 있다는 점이 좋았고,

다리 위 트럭의 총 무게와 빠져나가는 트럭의 무게만 알면 굳이 각 트럭의 무게를 들고 있을 필요도 없었다.

구현도 깔끔하게 되서 마음에 들었다.

 

코드

import java.util.*;
class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int totalWeight = 0; //다리 위 트럭 총 무게
        int totalTime = 0; //총 소요시간
        Queue<Integer> truckQueue = new LinkedList<Integer>(); //다리 위에 올라가있는 트럭 Queue
        
        int truckIndex = 0;
        int firstTruckIndex = 0; //다리 위 맨 앞 트럭의 인덱스
        Integer firstTruckTime = null; //다리 위 맨 앞 트럭의 진입시간
        while(firstTruckIndex < truck_weights.length){
            totalTime++;
            firstTruckTime = truckQueue.peek(); 
            if(firstTruckTime != null){
                if(totalTime == (firstTruckTime + bridge_length)){ //다리길이 + 진입시간 = 건넌 시간
                    truckQueue.remove();
                    totalWeight -= truck_weights[firstTruckIndex];
                    firstTruckIndex++;
                }
            }
            //추가 진입 가능하다면
            if(truckIndex < truck_weights.length && weight >= (totalWeight + truck_weights[truckIndex])){
                totalWeight += truck_weights[truckIndex++]; //총무게 추가
                truckQueue.add(totalTime); //진입시점 추가
            }
        }
        return totalTime;
    }
}

다리 위에 올라가있는 트럭의 Index, 다리 위 첫 트럭의 Index만 관리한다.

다리길이 + 진입시간 = 현재시간이면 트럭이 다리를 모두 건넌 것이므로 Queue에서 제거하고 총무게를 뺀다.

추가 진입이 가능하다면 총무게를 더하고 Queue에 추가한다.

 

결과

 

 

728x90
Comments