[Java] 13335 트럭

ideal dev·2023년 2월 22일
0

코딩테스트

목록 보기
59/69

1. 문제 링크 및 문제

https://www.acmicpc.net/problem/13335

2. 해결 방법 생각해보자 ...

큐에 들어오는 트럭을 입력하는데, 트럭은 자신의 무게와 다리 위치를 가지고 있다.
그 점을 활용하여 다리 길이와 다리 최대 하중의 조건에 맞게 큐에 넣고 빼면서 시간 ++!

3. 코드

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);
	}
}

4. 느낀점

다른 분들은 bridge 와 truck 2개의 큐를 사용해서 해결하신 풀이가 대부분이길래 한 번 공유해보려고 올렸다!
다리위치를 확인하는 과정에서 값 하나하나 접근을 하기엔 큐가 적합한 자료구조가 아니라
1,2번 과정이 살짝 혼란스러웠지만 첫번째 트럭만 확인한 후 아니라면 나머지는 한 칸씩 이동해주면서 해결했당
재밌당 ~~

0개의 댓글