조급하면 모래성이 될뿐

[프로그래머스]다리를 지나는 트럭 본문

Algorithm/Programmers

[프로그래머스]다리를 지나는 트럭

Pawer0223 2019. 11. 4. 20:02

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42583

 

코딩테스트 연습 - 다리를 지나는 트럭 | 프로그래머스

트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이는 bridge_length이고 다리는 무게 weight까지 견딥니다. ※ 트럭이 다리에 완전히 오르지 않은 경우, 이 트럭의 무게는 고려하지 않습니다. 예를 들어, 길이가 2이고 10kg 무게를 견디는 다리가 있습니다. 무게가 [7, 4, 5, 6]kg인 트럭이 순서

programmers.co.kr

코드

package Programmers.Level2;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class BridgeCross {

	public static void main(String[] args) {

		int bridge_length = 2 ;

		int weight = 10;

		int[] truck_weights = // { 10,10,10,10,10,10,10,10,10,10 };
		{7,4,5,6};


		int answer = solution(bridge_length, weight , truck_weights);

		System.out.println(answer);


	}//main

	public static int solution(int bridge_length, int weight, int[] truck_weights) {

		int answer = 0;
		

		// 기다리고있는 버스
		Queue<Integer> waitTruck = new LinkedList<Integer>();

		// 이동중인 버스
		List<Truck> workingTruck = new ArrayList<Truck>();

		// 트럭의 무게를 모두 넣어줌. 
		for ( int truck : truck_weights ) {
			waitTruck.add(truck);
		}

		// 이동한 시간.
		int time = 0;

		// 다리위에있는 총 무게
		int totalWeight = waitTruck.peek();

		// 첫번째 트럭은 넣어주기 working에
		workingTruck.add(new Truck(waitTruck.poll(),0));

		// 운행중 트럭이 모두 없어질때까지
		while ( !workingTruck.isEmpty() ) {

			time++;

			// 이동중인 버스가 있으면 모두 한칸 씩 이동시켜준다.
			for ( int i = 0 ; i < workingTruck.size(); i++ ) {
				workingTruck.get(i).index++;
			}

			// 도착한 트럭이있으면 빼준다.
			// 끝까지 갔으면 working에서 제외시켜준다.
			if ( workingTruck.get(0).index > bridge_length ) {
				totalWeight -= workingTruck.get(0).weight ;
				workingTruck.remove(0);
			}

			// 더 올릴 수 있는경우에는 대기에서 빼주고 working에 넣어준다.
			if ( !waitTruck.isEmpty() && totalWeight+waitTruck.peek() <= weight ) {
				int nextTruck = waitTruck.poll();
				totalWeight += nextTruck;
				workingTruck.add(new Truck(nextTruck,1));
			}
		}

		answer = time ;

		return answer;
	}
	
	static class Truck{
		int weight = 0;
		int index = 0 ;
		
		public Truck ( int weight , int index ) {
			this.weight = weight;
			this.index = index;
		}
	}//Truck
	
}//class

제출 결과

후기

잘 풀리지 않아서 인터넷을 참조했다..

 

대기 중인 트럭과 운행 중인 트럭을 관리하는 것이 포인트인 것 같다. 

최초에 문제를 읽어서 해당 힌트를 얻었지만 코드로 풀어내는데 잘 해결이 되지 않았다.

 

시간이 오래걸린 가장 큰 요인은 문제에 대한 이해도가 부족했고, 운행 중인 트럭이 지나간 거리를 계산하는데 잘못된 방법을 선택하고 있었다.

 

문제 1 :

처음에는 운행 중 트럭이 bridge_length 까지 가는 것을 조건으로 주었는데 버스가 다리를 지나가는 시점은 index가 bridge_length를 넘어가는 시점이었다... 이걸 계속 헷갈리고 있었다.. ㅠ

 

문제 2 :

처음에는 지나간 거리를 int[10001] 크기 배열을 선언해서 지나간 트럭을 ++해주었다.

그런데 두 번째 예제처럼 [ 10,10,10... 10 ] 이런 식으로 주어지는 경우 같은 대상을 cnt 해서.. 되질 않았다..

 

결국 인터넷 참조한 대로 Truck클래스를 별도로 만들어서 지나간 거리를 기록해 주어서 해결하였다.

반응형