본문 바로가기

ALGORITHM

백준 13335 트럭 (Java)

1. 문제 링크

 

13335번: 트럭

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

www.acmicpc.net

 

2. 문제 및 입출력예제

 

3. 문제 풀이

1. 트럭 큐에 각 트럭의 무게를 저장한다.
2. 다리의 각 위치마다 트럭 무게를 넣는 큐를 만든다.
    2-1. 처음에는 다리에 아무 트럭이 없기 때문에 모든 위치에 0을 넣는다.
3. 시간이 지나면서 다리 위치를 옮기기 위해 다리 큐에서 하나를 뺀다.
4. 지나올 트럭이 남아있으면 최대 하중을 확인한다.
    4-1. 지금 순서의 트럭이 추가되어도 최대 하중을 넘지 않으면 올린다. (앞에서 다리 큐 하나를 뺐으니까 추가만 신경쓰면 된다.)
    4-2. 최대 하중을 넘을 경우 트럭이 아니라 0을 올린다.

 

4. 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] split = br.readLine().split(" ");
        int N = Integer.parseInt(split[0]);
        int len = Integer.parseInt(split[1]);
        int max = Integer.parseInt(split[2]);
        int time = 0;
        int weight = 0;
        
        Queue<Integer> truck = new ArrayDeque<>();
        Queue<Integer> bridge = new ArrayDeque<>();
        
        split = br.readLine().split(" ");
        for(int i=0;i<N;i++) {
        	truck.offer(Integer.parseInt(split[i]));
        }
        
        for(int i=0;i<len;i++) {
        	bridge.add(0); //각 다리 위치에 있는 트럭 무게
        }
        
        while(!bridge.isEmpty()) {
        	time++;
        	weight -= bridge.poll(); //시간이 지나니까 다리 위치 하나씩 옮기는 느낌으로 빼기
        	
        	if(!truck.isEmpty()) {
        		if(truck.peek()+weight <= max) { //최대하중 확인
        			int now = truck.poll();
        			weight += now;
        			bridge.offer(now);
        		}
        		else {
        			bridge.offer(0); //못 가면 0 올리기
        		}
        	}
        }
        System.out.println(time);
    }
}

 

'ALGORITHM' 카테고리의 다른 글