본문 바로가기
코딩테스트/백준

[백준/java] 13335번: 트럭 (프로그래머스와 동일)

by drCode 2021. 8. 25.
728x90
반응형

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

 

728x90

13335번: 트럭

트럭의 갯수, 다리의 길이, 다리의 최대 하중이 주어지는 문제.

 

두개의 큐를 이용하여 해결하였다.

 

다리를 건너기위해 대기하는 큐, 다리 위를 지나가는 트럭 큐.

 

반응형

 

while문을 돌때, 두 큐 중에 한 큐라도 비어있지 않은지를 조사해야 다음의 경우들을 모두 조사할 수 있다.

(1) 다리에 차가 없을 때

(2) 다리에 차가 있으나 한대 더 들어가서 하중을 견딜 수 있을 때

(3) 다리에 더 들어갈 수 없으나 트럭의 이동을 진행시킬 때

 

대기 큐가 비어있지 않을 시 다리 위에 트럭이 더 올라갈 수 있으면 큐에서 빼서 다리가 견디고 있는 하중을 증가시킨다.

 

다리 큐에 데이터가 존재할 때, Iterator로 다리에 있는 트럭의 시간초를 1씩 증가시키고, 시간이 다리 길이만큼 도달하면 큐에서 빼주고, 다리가 견디고 있는 전체하중에서 큐에서 빠진 트럭의 무게만큼 빼주면 된다.

 

Iterator로 순회할때, map.remove(key);로 맵에서 제거하면 에러가 발생한다.

 

java.util.ConcurrentModificationException 발생

 

그러면 어떻게 해야 하는가?

 

map.remove(key) 대신 ir.remove()를 써주면 된다.

 

package simulation;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.StringTokenizer;

public class Truck {
	static class Car {
		int weight, time, number;

		public Car(int weight, int time, int number) {
			this.weight = weight;
			this.time = time;
			this.number = number;
		}

		@Override
		public String toString() {
			return "w : " + weight + ", time : " + time + ", number : " + number;
		}
	}

	static Queue<Car> bridge = new LinkedList<Car>();
	static Queue<Car> q = new LinkedList<Car>();
	static Map<Integer, Car> map = new HashMap<Integer, Truck.Car>();
	static int totalW;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");

		int n = stoi(st.nextToken());
		int w = stoi(st.nextToken());
		int l = stoi(st.nextToken());

		st = new StringTokenizer(br.readLine(), " ");
		for (int i = 0; i < n; i++) {
			q.add(new Car(stoi(st.nextToken()), 0, i));
		}

		int time = 1;
		while (!q.isEmpty() || !bridge.isEmpty()) {
			
			if(!q.isEmpty()) {
				// 다리위에 한대도 없을때
				if (bridge.size() == 0) {
					moveToBridge();
					// 다리위에 트럭이 있는데 더 들어가도 될 때
				} else {
					Car top = q.peek();

					if (totalW + top.weight <= l) {
						moveToBridge();
					}
				}
			} 
			
//			System.out.println("총 하중 : " + totalW);
			
			if(!bridge.isEmpty()) {
				// 차를 트럭에서 지나가게 한다.
				Iterator<Integer> ir = map.keySet().iterator();
				while (ir.hasNext()) {
					int key = ir.next();
					map.get(key).time++;

//					System.out.println(map.get(key).toString());

					if (map.get(key).time >= w) {
//						System.out.println(map.get(key).number + "번 차량 다리를 나간다.");
						// map.remove(key); // 이 코드를 실행할 시 java.util.ConcurrentModificationException 발생
						ir.remove();
						Car outTruck = bridge.poll();
						totalW -= outTruck.weight;
					}
				}
			}

			time++;
//			System.out.println("시간 : " + time + "초");

		}

		System.out.println(time);
	}

	public static void moveToBridge() {
		Car truck = q.poll();
//		System.out.println(truck.number + "번 차량 다리에 들어간다.");
		bridge.add(truck);
		totalW += truck.weight;
		map.put(truck.number, truck);
	}

	public static int stoi(String str) {
		return Integer.parseInt(str);
	}
}

 

728x90
반응형

댓글