[백준](Java) 13335 - 트럭

문제 링크

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

문제 풀이

프로그래머스에도 같은 문제가 있었는데 그때는 몸 비틀면서 풀었어서 그런지
그때의 풀이가 아직도 기억이 남았다.

 Queue<Integer> wait_trucks = new LinkedList<>();
 Queue<Integer> bridge_weight = new LinkedList<>();
 List<Integer> bridge = new ArrayList<>();

대기중인 트럭들을 wait_trucks 라는 queue로 담았는데 트럭들은 한번 다리로 나가면 더이상 안쓰기도 하며, 들어온 순서대로만 처리하면 되니 배열이나 list보다는 queue가 처리하기에 더 편할것이라 생각했다.
다리에 진출한 트럭들의 정보는 bridge에 담았고, 이 다리에 있는 트럭의 무게들은 bridge_weight라는 queue로 따로 담아서 처리했다.
둘의 값을 하나의 클래스로 만들어서 처리했어도 괜찮았을것 같다.

도착한 트럭의 갯수가 전체 트럭의 갯수가 될때 while 반복문을 종료시켰으며
반복문이 한번 도는것을 단위시간으로 나타내기 위해서 time을 반복마다 ++해주었다.
시간이 지날때마다

if (bridge.size() != 0) {
   for (int i = 0; i < bridge.size(); i++){ 
      bridge.set(i, bridge.get(i) + 1);
   }
   if (bridge.get(0) > w) {
      bridge.remove(0);
      arrive_trucks++;
      maxweight -= bridge_weight.poll();
   }
}

bridge에 있는 모든 값들을 +1 해주었고,
맨 앞에 있는 값이 w(다리의 길이) 보다 커지면 도착한것이므로 맨앞의 값을 삭제
도착 카운트 증가, bridge_weight에서 가장 앞의 무게값만큼 다리의 무게에서 -를 해주었다.

(bridge.size() != 0)인경우에는 아래의 logic을 수행할일이 없으므로 우선 체크한다.

아직 대기중인 트럭이 있는 경우에는

          if (!wait_trucks.isEmpty()) {
              if (maxweight + wait_trucks.peek() <= l) {
                  bridge.add(1);
                  bridge_weight.add(wait_trucks.peek());
                  maxweight += wait_trucks.poll();
              }
          }

현재 다리의 무게 + 제일 앞에서 대기중인 트럭의 무게가 <= 다리의 최대하중
이 성립하게 되면 bridge에는 한칸 전진한 위치인 1로 추가로 해주게 되고, 현재의 무게,
bridge_weight에 제일 앞에서 대기중인 트럭의 무게를 추가한다.


코드

import java.util.*;

public class Main {

    static int n; //트럭 개수
    static int w; //다리 길
    static int l; //최대하중 트럭 무게의 합보다 크거나 같아야한다.
    static int time = 0;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        w = sc.nextInt();
        l = sc.nextInt();
        int maxweight = 0;
        Queue<Integer> wait_trucks = new LinkedList<>();
        Queue<Integer> bridge_weight = new LinkedList<>();
        List<Integer> bridge = new ArrayList<>();
        int arrive_trucks = 0;
        for (int i = 0; i < n; i++) {
            wait_trucks.add(sc.nextInt());
        }

        while (arrive_trucks != n) {
            time++;
//            System.out.println(time);

            if (bridge.size() != 0) {
                for (int i = 0; i < bridge.size(); i++) {
                    bridge.set(i, bridge.get(i) + 1);
                }

                if (bridge.get(0) > w) {
                    bridge.remove(0);
                    arrive_trucks++;
                    maxweight -= bridge_weight.poll();
                }

            }

            if (!wait_trucks.isEmpty()) {
                if (bridge.size() != 0 && bridge.get(0) > w) {
                    bridge.remove(0);
                    arrive_trucks++;
                    maxweight -= bridge_weight.poll();
                }

                if (maxweight + wait_trucks.peek() <= l) {
                    bridge.add(1);
                    bridge_weight.add(wait_trucks.peek());
                    maxweight += wait_trucks.poll();
                }
            }
//            System.out.println(wait_trucks.toString());
//            System.out.println(bridge.toString());
        }
        System.out.println(time);
    }
}

좋은 웹페이지 즐겨찾기