문제
해결 방법
처음엔 큐를 사용해서 구현을 하려다가 그냥 리스트로 구현을 해도 무관해보여서 리스트로 구현을 했다.
Truck 클래스를 통해서 무게와 다리에 머문 시간 값을 가질 수 있게 해주었고,
다리에서 머문 시간이 w와 동일하면 리스트에서 제거해주는 방식을 사용했다.
리스트에서 값을 제거하면 index 값이 한 칸씩 앞으로 당겨지기 때문에 i--를 통해서 맞추어주었고,
다음 순서의 트럭이 어떤 트럭인지 알기위해 nextIdx를 사용했고,
nextIdx가 n 범위를 벗어나면 더 이상 남아있는 트럭이 없는 것이기 때문에 추가 작업을 하지 않도록 조건을 설정했다.
또 현재 다리에 있는 트럭들의 무게를 알기 위해 curWeight를 사용했고, 만약 현재 다리 위의 있는 트럭의 무게가 다음 트럭이 다리로 올라왔을 때 무게의 합이 L과 같거나 작으면 추가로 트럭이 다리 위를 지나갈 수 있기 때문에 그 경우에는 리스트에 추가하는 식으로 진행했다.
총 시간(result)은 1 부터 시작하는데 그 이유는 처음 트럭을 다리 위로 올려놓고 시작하기 때문에 1초가 소비되어서 그렇다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
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());
int trucks[] = new int[n];
st = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < n; i++) {
trucks[i] = Integer.parseInt(st.nextToken());
}
ArrayList<Truck> list = new ArrayList<>();
int curWeight = trucks[0];
int nextIdx = 1;
int result = 1;
list.add(new Truck(trucks[0], 0));
while(!list.isEmpty()) {
// 현재 리스트에 존재하는 즉, 다리 위에 있는 트럭들이
// 머문시간을 1씩 추가해준다.
for (Truck temp : list) {
temp.time++;
}
// 다리 길이만큼 머물렀으면 다리를 지나간 것이므로
// 제거해준다.
for (int i = 0; i < list.size(); i++) {
if (list.get(i).time == w) {
curWeight -= list.get(i).weight;
list.remove(i);
i--;
}
}
// 다리 위에 추가로 트럭이 더 올라갈 수 있다면
// 추가 해줌.
if (nextIdx < n) {
if (curWeight + trucks[nextIdx] <= L) {
list.add(new Truck(trucks[nextIdx], 0));
curWeight += trucks[nextIdx];
nextIdx++;
}
}
result++;
}
System.out.println(result);
}
}
class Truck {
int weight;
int time;
Truck(int weight, int time) {
this.weight = weight;
this.time = time;
}
}
'Algorithm > BaekJoon' 카테고리의 다른 글
[JAVA] 백준 8972 : 미친 아두이노 (0) | 2021.04.21 |
---|---|
[JAVA] 백준 11967 : 불켜기 (0) | 2021.04.20 |
[JAVA] 백준 4991 : 로봇 청소기 (0) | 2021.04.19 |
[JAVA] 백준 6087 : 레이저 통신 (0) | 2021.04.15 |
[JAVA] 백준 2638 : 치즈 (0) | 2021.04.14 |