https://www.acmicpc.net/problem/13335
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
import java.util.concurrent.LinkedBlockingDeque;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken()); // 다리를 건너는 트럭의 수
int w= Integer.parseInt(st.nextToken()); // 다리의 길이
int l= Integer.parseInt(st.nextToken()); // 다리의 최대 하중
Queue<Integer> truck = new LinkedList<>();
Queue<Integer> bridge = new LinkedList<>();
int count=0; // 시간
int bridgeWeight=0; //다리의 무게
st = new StringTokenizer(br.readLine());
for(int i=0; i<n; i++){
truck.offer(Integer.parseInt(st.nextToken())); // 트럭의 무게
}
for(int i=0; i<w; i++){
bridge.add(0); // 다리를 모두 0으로 초기화
}
while(!bridge.isEmpty()) { // 다리위에 아무것도 없을 때까지
count++;
bridgeWeight-=bridge.poll(); // 다리무게에서 내려온 트럭 무게를 뺌
if(!truck.isEmpty()){ // 트럭이 남아있다면
if(truck.peek()+bridgeWeight <= l) { // 앞의 트럭이 더해져도 다리의 최대하중보다 작다면
bridgeWeight+=truck.peek();
bridge.offer(truck.poll()); // 다리에 트럭 추가
}else{ // 최대 하중을 초과하면
bridge.offer(0); // 다리위에 아무것도 안실림
}
}
}
System.out.println(count);
}
}
트럭의 무게를 truck 큐에 차례로 넣고, bridge 큐를 일단 모두 0으로 채운다.
다리 큐에 트럭 큐에 있는 트럭들을 하나씩 넣는식으로 진행한다.
다리 무게는 다리에서 내려온 트랙들의 무게를 빼주며 갱신한다.
트럭이 트럭 큐에 남아있다면, 큐의 맨 앞에있는 트럭과 현재 다리의 무게가 다리의 최대하중보다 작아 맨 앞의 트럭을 다리에 올려놓을 수 있는지 검사한다.
올려놓을 수 있다면, 다리 무게에 맨 앞의 트럭 무게를 더해 다리 무게를 갱신시킨다.
올려놓을 수 없다면, 다리 큐에 0을 추가한다.
이렇게 다리 위에 아무것도 없을 때 까지 while문을 돌고, 돌때마다 count 를 증가시켜 다리를 건넌 총 시간을 구한다.
'ALGORITHM' 카테고리의 다른 글
[JAVA] 알고리즘 : 정렬- 버블정렬 (0) | 2022.07.25 |
---|---|
[JAVA] 알고리즘 : 정렬- 선택정렬 (0) | 2022.07.25 |
[JAVA] 백준 5464번- 주차장 (0) | 2022.07.22 |
[JAVA] 백준 1157번- 단어 공부 (0) | 2022.07.22 |
[JAVA] 백준 17413번- 단어 뒤집기2 (0) | 2022.07.21 |