본문 바로가기

알고리즘 관련/BOJ

13335 트럭

https://www.acmicpc.net/problem/13335

 

13335번: 트럭

입력 데이터는 표준입력을 사용한다. 입력은 두 줄로 이루어진다. 입력의 첫 번째 줄에는 세 개의 정수 n (1 ≤ n ≤ 1,000) , w (1 ≤ w ≤ 100) and L (10 ≤ L ≤ 1,000)이 주어지는데, n은 다리를 건너는 트

www.acmicpc.net

간단한 문제이지만 논리를 헷갈려서 헤맸던 문제였다. 입력의 크기가 작기 때문에 다리를 다 빠져나가는 시간을 바로 계산하지 않고, 1초 단위로 계산하여도 100만으로 시간이 충분하다. 따라서 time이라는 변수를 증가시켜 계산하도록 하고, 무게 제한을 구현하기 위해 deque를 사용하였다. 이후 트럭의 대기 큐에서 하나씩 빼내어 넣게 되는데, 이 때 주의할 점은 트럭이 다리를 다 빠져나갔을 때 다른 트럭이 동시에 들어올 수 있다는 점에 유의한다.

import java.io.*;
import java.util.*;
public class Main {
  static int N, W, L;
  static Queue<Integer> q = new ArrayDeque<>();
  public static void main(String[] args) throws Exception {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());
    N = Integer.parseInt(st.nextToken()); W = Integer.parseInt(st.nextToken()); L = Integer.parseInt(st.nextToken());
    st = new StringTokenizer(br.readLine());
    for(int i = 0; i < N; i++){
      q.add(Integer.parseInt(st.nextToken()));
    }
    int time = 0;
    Queue<Integer> wait = new ArrayDeque<>();
    Deque<Integer> bridge = new ArrayDeque<>();
    wait.add(1);
    bridge.addLast(q.poll());
    while(!q.isEmpty() || !wait.isEmpty()){
      ++time;
      //트럭이 다 빠져나갔을 때
      if(time >= wait.peek() + W){
        wait.poll();
        bridge.pollFirst();
      }
      //트럭은 동시에 들어올 수 있기 때문에 이 조건이 아래에 있어야 한다.
      //무게 제한에 걸리지 않고 트럭이 더 들어갈 수 있다면
      if(!q.isEmpty()){
        if(bridge.stream().reduce(0, Integer::sum) + q.peek() <= L){
          wait.add(time);
          bridge.addLast(q.poll());
        }
      }
    }
    System.out.println(time);
  }
}

'알고리즘 관련 > BOJ' 카테고리의 다른 글

10836 여왕벌  (0) 2022.02.04
1967 트리의 지름 구하기  (0) 2022.02.03
1916 최소비용 구하기  (0) 2022.02.03
11062 카드 게임  (0) 2022.01.06
22254 공정 컨설턴트 호석  (0) 2022.01.06