본문 바로가기

카테고리 없음

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

문제 출처 - Programmers

문제는 여기

 

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

트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈

programmers.co.kr


[풀이]

1. 큐가 비어 있으면 다리를 건너고 있는 차가 없다는 것이므로 큐에 현재 트럭을 넣어주고, 총무게에 현재 트럭의 무게를 증가시켜주고, 시간을 증가시켜 준다.

2. 큐의 길이가 다리의 길이와 같으면 총 무게에서 큐의 맨 처음 무게를 빼주고, 큐에서 맨 앞을 빼준다.

3. 다리길이만큼 큐가 차지 않았다면

3-1. 큐에 들어있는 무게 + 현재 트럭의 무게가 다리가 지탱할 수 있는 무게보다 크다면 큐에 0을 넣어주고 시간을 증가시킨다.

3-2. 아니라면 현재 트럭의 무게를 큐에 넣어주고 시간과 총무게를 증가시켜 준다.

4. 입력으로 주어지는 트럭의 수만큼 반복한다.

5. 마지막에 들어간 트럭이 시간과 마지막 트럭이 다리를 건너는데 걸리는 시간을 합친 것을 출력한다.

[접근]

1. 트럭들을 큐에 담아가면서 큐가 다 비워질 때, 총시간을 구해주면 되겠다고 생각하였다.

[코드]

import java.util.*;

class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        Queue<Integer> queue = new LinkedList<>();
		int weights = 0;
		int time = 0; 

		for(int i = 0; i < truck_weights.length; i++) {
            // 현재 트럭
			int now = truck_weights[i];

            while(true) {
                // 큐가 비어있으면 트럭이 지나갈 수 있음
                if (queue.isEmpty()) { 
                    queue.add(now);
                    // 다리위에 있는 트럭의 무게
                    weights += now;
                    // 다리에 올라가는 시간
                    time++;
                    break;
                }
                // 큐의 길이가 다리의 길이와 같으면
                else if (queue.size() == bridge_length) {
                    weights -= queue.poll();
                }
                // 다리 길이만큼 큐가 차지 않은 경우
                else {
                    // 큐에 들어있는 트럭들의 무게와 현재 트럭의 무게가 다리가 견디는 무게보다 작거나 같으면
                    if (weights + now <= weight) {
                        // 현재 트럭을 큐에 넣어줌
                        queue.add(now);
                        weights += now;
                        time++;
                        break;
                    }
                    // 아니라면 큐에 0을 넣어줌
                    else {
                        queue.add(0);
                        time++;
                    }
                }
            }
        }
        // 걸린 시간 + 다리길이 (마지막 트럭도 다리 길이만큼 지나가야하기에)
		return time + bridge_length;
    }
}