본문 바로가기
알고리즘/항해99 스터디

99클럽 코테 스터디 3일차 TIL - 스택/큐

2024. 5. 22.

항해99 코테 스터디 3일차 문제인 프로그래머스의 '다리를 지나는 트럭'은 트럭이 순서대로 다리를 모두 지나는 최소 시간을 구하는 문제다. 난이도는 레벨2이며 Queue를 통해 해결할 수 있다.

 

오늘의 문제 - 다리를 지나는 트럭 문제 정보

문제 키워드

- 스택/큐

난이도

- Level 2

 

문제 요약

  • 트럭이 순서대로 다리를 지나야 하는데, 다리에 올라가 있는 트럭 무게의 합이 최대 하중 이하여야 한다.
  • 트럭이 모두 건너는 데 걸리는 최소 시간을 구하라.

 

문제 풀이 과정  

  • 트럭의 순서는 정해져 있고, 매 시간마다 어떤 트럭이 올라가고 내려가는지를 확인하면 된다.
  • 시간의 흐름에 따라 증가하는 변수 t를 두어 while문 내에서 로직을 처리한다.
  • 매 시간마다
    • 큐의 맨앞 트럭을 확인한다. 현재 시간과 다리에 올라간 시간의 차이가 다리 길이와 같으면 큐에서 뺀다.
    • 다음으로 올라갈 트럭의 무게를 확인한다. 현재 다리에 올라간 트럭들의 무게와 다음 트럭의 무게의 합이 최대 하중보다 작거나 같으면 큐에 넣는다.
  • 모든 트럭이 다리를 지나 내려오면 그때의 시간 t를 응답으로 반환한다.

코드

import java.util.*;

class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int N = truck_weights.length;
        
        Queue<Truck> trucks = new LinkedList<>();
        int t = 0, idx = 0; // t: 현재 시간, idx: 다음으로 건널 트럭 인덱스
        int restT = N;      // 아직 건너지 않은 트럭 수
        int currentW = 0;   // 현재 다리에 올라간 트럭 무게의 합
        
        while(restT > 0) {
            // 1초 지남
            t++;
            
            // 1. 다리 위의 맨 앞 트럭이 도착한지 확인
            // 트럭이 들어간 시간과 현재 시간의 차이가 다리 길이보다 길면 pop
            if (!trucks.isEmpty()) {
                Truck first = trucks.peek();
                if (t - first.enterTime >= bridge_length) {
                    restT--;
                    currentW -= first.weight;
                    trucks.poll();
                }
            }
            
            // 2. 다리에 새 트럭을 추가할 수 있는지 확인
            // 다음 트럭이 올라가도 최대 하중을 넘지 않으면 push
            if (idx < N && currentW + truck_weights[idx] <= weight) {
                trucks.add(new Truck(truck_weights[idx], t));
                currentW += truck_weights[idx];
                idx++;
            }
        }
        
        return t;
    }
    
    class Truck {
        int weight;
        int enterTime;
        
        public Truck(int weight, int enterTime) {
            this.weight = weight;
            this.enterTime = enterTime;
        }
    }
}
  • 시간복잡도: O(L*N) → 다리 길이 L, 트럭 개수 N. 모든 트럭이 한번에 하나씩만 올라갈 수 있는 경우에 걸리는 시간.
  • 공간복잡도: O(N) 

 

오늘의 학습 회고

새롭게 알게된 것

  • Deque는 맨앞에 추가 또는 맨뒤에서 삭제가 필요한 경우에만 사용하자. 이 문제는 그럴 필요가 없으므로 Queue로도 해결 가능하다.
728x90

댓글