문제
https://programmers.co.kr/learn/courses/30/lessons/42583?language=java
풀이
- Queue로 사용할 데이터들의 전처리를 진행한다.
- 출발하는 트럭 배열을 Trucks Queue로 재선언한다.
- Bridge의 길이만큼 무게 0으로 채워둔 Bridge Queue를 선언한다.
- 알고리즘 시작.
- Bridge Queue의 맨 앞 무게를 빼낸다.
- 빼낸 무게가 0보다 클 경우, 현재 Bridgee Queue의
총 무게에서 차감 후 도착지 Queue에 삽입한다.
- 빼낸 무게가 0보다 클 경우, 현재 Bridgee Queue의
- 현재 Bridge Queue의 총 무게와 대기중인 Trucks Queue의
첫 번째 트럭 무게 합이 허용 무게를 넘는지 비교한다.- 넘지 않는다면, Trucks Queue에서 Bridge Queue로 이동시키고,
Bridge Queue의 총 무게를 업데이트한다. - 넘는다면, 그냥 0을 채워넣어서 트럭의 움직임을 기록한다.
- 넘지 않는다면, Trucks Queue에서 Bridge Queue로 이동시키고,
- Bridge Queue의 맨 앞 무게를 빼낸다.
import java.util.*;
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
Queue Bridge = new LinkedList();
Queue Trucks = new LinkedList();
Queue Arrived = new LinkedList();
// Bridge Queue에 0 채워넣기.
for(int i = 0; i < bridge_length; i++) Bridge.add(0);
// truck_weights 배열을 Trucks Queue로 변환.
for(int i = 0; i < truck_weights.length; i++) Trucks.add(truck_weights[i]);
// 시간측정 변수, Bridge Queue 총 무게 변수.
int timer = 0, bridgeWeight = 0;
// 도착한 트럭의 수가 시작 트럭 수와 같아질 때 까지 루프.
while(Arrived.size() < truck_weights.length){
timer += 1; // 시간측정.
// Bridge Queue의 가장 앞 값 추출
int arrive = (int)Bridge.poll();
if(arrive > 0){ // 차량이었다면 도착지에 추가, 다리 무게 업데이트.
Arrived.add(arrive);
bridgeWeight -= arrive;
}
// 남은 트럭이 있고, 현재 다리의 무게와 추가될 트럭의 무게 합이 허용량 내라면,
if(!Trucks.isEmpty() && bridgeWeight + (int)Trucks.peek() <= weight){
bridgeWeight += (int)Trucks.peek(); // 다리 무게 업데이트.
Bridge.add(Trucks.poll()); // Trucks Queue -> Bridge Queue 이동.
} else Bridge.add(0); // 아니면 그냥 0 추가해서 트럭 이동 표현.
}
return timer;
}
}
확실히 풀어본 문제라고 20분만에 쉽게 풀어냈다.
전처리부터 확실하게 잘 설계하면, 핵심 알고리즘 구상도 쉽게 된다.
댓글남기기