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

MandarinePunch·2022년 3월 4일
0

코딩 테스트

목록 보기
1/8
post-thumbnail

문제 설명


하중과 길이가 정해진 다리에 트럭 여러 대가 건너가려고 할 때, 걸리는 최소 시간을 구하는 문제이다.

다리 길이(bridge_length), 버틸 수 있는 하중(weight), 트럭의 수와 무게를 알 수 있는 배열(truck_weights)이 값으로 주어졌다.

import java.util.*;

class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int answer = 0;
        Queue<Integer> bridge = new LinkedList<>(); 
		// 비어있는 다리의 공간을 0으로 가득 채웠다.
        for(int i=0;i<bridge_length;i++){
            bridge.offer(0);
        }
        
        int index = 0;
        // 다리에 있는 현재 트럭의 무게이다.
        int currentWeight = 0;
        // 트럭이 더이상 남아있지 않을 때 탈출해주기 위해 조건을 만들었다.
        while(index < truck_weights.length){
        	// 현재 다리에 있는 트럭무게에서 곧 나갈 트럭의 무게를 빼준다.
            currentWeight -= bridge.poll();
            // 새 트럭이 들어올 것이므로 1초를 추가한다.
            answer++;
            // 현재 다리에 있는 트럭 무게와 곧 들어올 트럭 무게의 합과 다리의 하중을 비교
            if(currentWeight + truck_weights[index] <= weight){
            	// 무게를 버틴다면 다리에 트럭을 추가한다.
                bridge.offer(truck_weights[index]);
                // 현재 다리에 있는 트럭 무게에도 새 트럭 무게를 더해준다.
                // 그리고 다음 트럭을 지정하기 위해 후위 연산자를 써주어 index를 증가시켰다.
                currentWeight += truck_weights[index++];
            } else{
            	// 버티지 못한다면 0을 추가한다.
                bridge.offer(0);
            }
        }
        //처음 설정한 0으로 채워진 다리가 전부 치환되면 결국 처음 다리 길이와 같으므로
        //트럭이 지나간 시간 + 다리 길이
        return answer + bridge_length; 
    } 
}

최종 코드이다. java를 이제 막 공부하고 있는 입장이라 queue를 처음 써보지만 문제 유형이 스택/큐로 분류되어 있어 queue를 이용하여 풀어봤다.

while(index < truck_weights.length){
    answer++;
    currentWeight -= bridge.poll();
    if(currentWeight + truck_weights[index] <= weight){
        bridge.offer(truck_weights[index]);
        currentWeight += truck_weights[index++];
    } else{
        bridge.offer(0);
    }
}

이 로직을 짤 때 생각을 많이 했는데, 결국 문제 그대로 다리에서 트럭을 넣고 빼는 것이 가장 직관적이고 구현이 쉬워 이렇게 구현했다.

profile
개발을 좋아하는 귤나라 사람입니다.

0개의 댓글