프로그래밍 공방

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

개발/문제해결

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

hyosupsong 2020. 11. 22. 23:29

문제

programmers.co.kr/learn/courses/30/lessons/42583

 

코딩테스트 연습 - 다리를 지나는 트럭

트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이

programmers.co.kr

문제해결방법

이 문제는 마지막 트럭이 들어가는 시간이 중요하다고 생각했다.

1. 시간 T를 증가시켜가며 큐에 트럭을 집어넣는다.

2. N번 트럭이 다리에 오를 때 다리가 견디는 무게를 초과하면 큐의 앞부터 N번 트럭이 올라갈 수 있을 때까지 트럭을 뺀다.

3. 트럭을 빼면서 트럭이 들어간 시간과 다리의 길이를 이용해서 트럭이 다리에서 나오는 시간을 계산한다.

4. 위에서 계산한 시간과 지금 트럭을 넣을 시간을 비교해서 위의 시간이 더 큰 경우에 현재 시간을 교체해준다.

5. 위 과정을 마지막 트럭을 넣을 때까지 반복한다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package Programmers;
 
import java.util.LinkedList;
import java.util.Queue;
 
public class Solution_다리를지나는트럭 {
    
    public static int solution(int bridge_length, int weight, int[] truck_weights) {
        int answer = 0;
        int curWeight = 0;
        Queue<int[]> q = new LinkedList<>();
        q.add(new int[]{truck_weights[0], ++answer});
        curWeight += truck_weights[0];
        for(int i=1; i<truck_weights.length; i++) {
            while(weight<curWeight+truck_weights[i]) {
                int[] truck = q.poll();
                curWeight-= truck[0];
                answer = truck[1]+bridge_length-1;
            }
            q.add(new int[]{truck_weights[i], ++answer});
            curWeight += truck_weights[i];
        }
        while(!q.isEmpty()) answer = q.poll()[1+ bridge_length;
        return answer;
    }
    
    public static void main(String[] args) {
        int bridge_length = 100;
        int weight = 100;
        int[] truck_weights = {10,10,10,10,10,10,10,10,10,10};
        System.out.println(solution(bridge_length, weight, truck_weights));
    }
}
cs


코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.