문제

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

예를 들어, 길이가 2이고 10kg 무게를 견디는 다리가 있습니다. 무게가 [7, 4, 5, 6]kg인 트럭이 순서대로 최단 시간 안에 다리를 건너려면 다음과 같이 건너야 합니다.

경과 시간 다리를 지난 트럭 다리를 건너는 트럭 대기 트럭
0 [] [] [7,4,5,6]
1~2 [] [7] [4,5,6]
3 [7] [4] [5,6]
4 [7] [4,5] [6]
5 [7,4] [5] [6]
6~7 [7,4,5] [6] []
8 [7,4,5,6] [] []

따라서, 모든 트럭이 다리를 지나려면 최소 8초가 걸립니다.

solution 함수의 매개변수로 다리 길이 bridge_length, 다리가 견딜 수 있는 무게 weight, 트럭별 무게 truck_weights가 주어집니다. 이때 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 return 하도록 solution 함수를 완성하세요.

 

제한 조건

  • bridge_length는 1 이상 10,000 이하입니다.
  • weight는 1 이상 10,000 이하입니다.
  • truck_weights의 길이는 1 이상 10,000 이하입니다.
  • 모든 트럭의 무게는 1 이상 weight 이하입니다.

나의 코드

import java.util.*;

public class BridgeTruck {

    public static int solution(int bridge_length, int weight, int[] truck_weights) {
    	int answer = 0;	
    	int onBridgeW = 0;   
    	Queue<Truck> start = new LinkedList<>(); 
    	Queue<Truck> on = new LinkedList<>();	
    	for(int i=0; i<truck_weights.length; i++) {
    		start.add(new Truck(truck_weights[i],0));
    	}
    	
    	while(!start.isEmpty() || !on.isEmpty()) {
    		answer++;
    		if(!on.isEmpty()) {	
    			Truck comp = on.peek();
    			if(answer - comp.where >= bridge_length) {
    				onBridgeW -= comp.weight;
    				on.poll();
    			}
    		}
    		if(!start.isEmpty()) { 
    			if(onBridgeW + start.peek().weight <= weight) {	
    				Truck comp = start.poll();
    				onBridgeW += comp.weight;
    				on.add(new Truck(comp.weight, answer));
    			}
    		}
    	}
    	return answer;
    }
}
class Truck {
    int weight;
    int where;
    
    Truck(int weight, int where){
        this.weight = weight;
        this.where = where;
    }
}

 

나의 풀이

우선 꽤 많은 시간을 고민하고 도전해 보았다. 근데 논리력이 부족한지 검색의 힘을 많이 빌렸다.

고민이 길어지는건 좋지만 너무 길어지면 찾아보고 하는게 효율이 좋다던 스승님의 말을 따르기로 했다.

1. 먼저 트럭들의 정보를 가지고있을 도메인 객체를 만든다. (트럭의 중량, 트럭의 위치)

2. 현재 다리 위의 총 중량을 갖고있는 onBridgeW (int)

3. 대기하고있는 트럭 start (Queue<Truck>)

4. 다리위에 있는 트럭 on (Queue<Truck>)

5. while문을 통해 대기하고있는 트럭이 비지 않거나 다리 위의 트럭이 비어있지 않으면 반복

6. 5번의 상황이 충족되면 어쨌든 한번의 이동이 일어나니 answer++

7. if문을 통해 다리위가 비어있지 않다면 다리위의 트럭중 가장 먼저들어온 트럭의 정보를 넣는다.

8. 만약 트럭의 위치가 다리의 길이를 초과하거나 같다면 다리위의 총 중량(onBridgeW)에서 뺀다.

9. 그리고 다리위의 트럭정보를 가지고 있는 on에서 빼준다.

10. 만약 대기하고 있는 트럭이 안비었고, 다리위의 총 중량과 출발하려는 트럭의 중량을 합친게 허용 중량보다 작다면

11. 시작 트럭의 정보를 트럭도메인 객체에 저장하면서 대기 트럭 큐에서 제거(poll) 

12. 다리위의 총 중량에 출발한 트럭의 무게를 더한다.

13. 다리위의 트럭의 정보를 가지고 있는 큐에 출발한 트럭을 추가시킨다.

 

'코딩테스트 풀이 > 프로그래머스' 카테고리의 다른 글

스택/큐 - 프린터 [JAVA]  (0) 2020.05.26
스택/큐 - 기능개발 [JAVA]  (0) 2020.05.25
스택/큐 - 탑 [JAVA]  (0) 2020.05.23
해시 - 베스트앨범 [JAVA]  (0) 2020.05.23
해시 - 위장 [JAVA]  (0) 2020.05.21

+ Recent posts