https://www.acmicpc.net/problem/13335
큐에 들어오는 트럭을 입력하는데, 트럭은 자신의 무게와 다리 위치를 가지고 있다.
그 점을 활용하여 다리 길이와 다리 최대 하중의 조건에 맞게 큐에 넣고 빼면서 시간 ++!
import java.io.*;
import java.util.*;
class truck{
int myWeight, NowBridge;
truck(int myWeight, int NowBridge){
this.myWeight = myWeight;
this.NowBridge = NowBridge;
}
}
public class Main {
static int trucksCount, BridgeLength, BridgeMaxWeight ;
static int[] arr ;
public static void main(String[] args) throws IOException {
// 값 입력받기 -->
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
trucksCount = Integer.parseInt(st.nextToken()); // 트럭의 개수
BridgeLength = Integer.parseInt(st.nextToken()); // 다리의 길이
BridgeMaxWeight = Integer.parseInt(st.nextToken()); // 다리 최대 하중
arr = new int[trucksCount]; // 트럭의 정보
st = new StringTokenizer(br.readLine());
for(int i=0;i<trucksCount;i++) arr[i] = Integer.parseInt(st.nextToken());
// <--
int nowWeight = 0 ; // 다리 위 현재 무게
Queue<truck> q = new LinkedList<>();
// 첫번째 트럭 출발
q.add(new truck(arr[0], 1));
nowWeight += arr[0];
int nowIdx = 1 ;
int Time = 1 ;
while(!q.isEmpty()){
Time ++ ;
// 1. 첫번째 트럭이 다리 끝에 있다면 제거 (맨 앞 트럭이 아닌 이상 제거할 일이 없으므로 첫번째 트럭만 봄)
truck firstT = q.peek();
if(firstT.NowBridge == BridgeLength){
nowWeight -= firstT.myWeight;
q.poll();
}
// 2. 다리 위 모든 트럭 한 칸씩 이동
for(truck nowT : q) nowT.NowBridge ++ ;
// 3. 현재 다리 위의 무게가 BridgeMaxWeight 보다 낮고, 다음 트럭을 더한 값과 크거나 같다면 q에 삽입
if(nowIdx < trucksCount &&( nowWeight + arr[nowIdx]) <= BridgeMaxWeight){
q.add(new truck(arr[nowIdx], 1));
nowWeight += arr[nowIdx];
nowIdx ++ ;
}
}
System.out.println(Time);
}
}
다른 분들은 bridge 와 truck 2개의 큐를 사용해서 해결하신 풀이가 대부분이길래 한 번 공유해보려고 올렸다!
다리위치를 확인하는 과정에서 값 하나하나 접근을 하기엔 큐가 적합한 자료구조가 아니라
1,2번 과정이 살짝 혼란스러웠지만 첫번째 트럭만 확인한 후 아니라면 나머지는 한 칸씩 이동해주면서 해결했당
재밌당 ~~