항해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
'알고리즘 > 항해99 스터디' 카테고리의 다른 글
99클럽 코테 스터디 6일차 TIL - 우선순위큐 (0) | 2024.05.25 |
---|---|
99클럽 코테 스터디 5일차 TIL - 우선순위큐 (0) | 2024.05.24 |
99클럽 코테 스터디 4일차 TIL - 스택 (0) | 2024.05.23 |
99클럽 코테 스터디 2일차 TIL - 문자열, 해시 (0) | 2024.05.21 |
99클럽 코테 스터디 1일차 TIL - 해시 (0) | 2024.05.20 |
댓글