-
Level2) 다리를 지나는 트럭PS/programmers 2020. 10. 11. 15:57
import java.util.*; public class Solution { public int solution(int bridge_length, int weight, int[] truck_weights) { int time = 0; Queue<Truck> boarding = new LinkedList<>(); Queue<Truck> waiting = new LinkedList<>(); for (int t : truck_weights) { waiting.offer(new Truck(t, bridge_length)); } int remain_weight = weight; while (!(waiting.isEmpty() && boarding.isEmpty())) { if (!waiting.isEmpty()) { int nowWeight = waiting.peek().weight; if (remain_weight - nowWeight >= 0) { // 대기열 맨 앞의 트럭을 태울 수 있는가 ? remain_weight -= nowWeight; // 무게 업데이트 boarding.offer(waiting.poll()); // 탑승 } } // 탑승을 하던 탑승을 하지 않던 현재 탑승한 트럭의 거리는 1만큼 줄어들고 시간은 1 늘어난다 if (!boarding.isEmpty()) { Iterator<Truck> it = boarding.iterator(); while (it.hasNext()) { Truck next = it.next(); next.distance--; if (next.distance == 0) { remain_weight += next.weight; } else if (next.distance < 0) { it.remove(); } } time++; } } return time; } } class Truck { int weight; int distance; public Truck(int weight, int distance) { this.weight = weight; this.distance = distance; } }
- Stack/Queue, FIFO인 걸로 봐서 Queue 사용해야겠다고 생각
- waiting, boarding 이렇게 2개의 큐 사용
- 작성하다보니 다리의 길이를 어떻게 해야 할까 하다가 클래스 하나에 길이를 넣고 같이 묶어서 큐에 넣음
- 완료가 된다는건 대기 중인 트럭도 없고, 다리에 올라간 트럭도 없다는 거니까 두 개의 큐가 전부 빌 때까지 반복
- 대기열 맨 앞의 트럭의 무게를 계산해서 탑승이 가능한가 ? 를 구분함
- 가능하다면 remain_weight를 업데이트해주고 탑승
- 다리에 올라간 트럭들의 distance를 1씩 감소시켜주고 시간도 1초씩 증가시켜줌
- 만약 distance가 0이라면 remain_weight을 업데이트 시켜줘야 1초 후 이 트럭이 나가면서 새로운 트럭이 들어올 수 있음
- distance가 0 이하일 때 제거
- 오래 걸렸는데 좀 기분 좋게 풀이 성공
- 다른 사람 풀이 보는 거보다 내가 처음 생각한 대로 따라가는 게 이해가 잘됨
'PS > programmers' 카테고리의 다른 글
Level2)가장 큰 수 (0) 2020.11.10 Level2) 기능개발 (0) 2020.11.10 Level2) 주식가격 (0) 2020.10.09 Level2) 프린터 (0) 2020.10.09 Level1) 두 개 뽑아서 더하기 (0) 2020.10.08