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

조예빈·2024년 7월 9일
0

Coding Test

목록 보기
45/138

https://school.programmers.co.kr/learn/courses/30/lessons/42583
전체적인 로직은 다음과 같다. 따져야 할 조건이 많기 때문에 상당히 복잡하다 ㅠㅠ

break문 때문에 많이 헤맸다.

break문을 거는 조건은 '트럭이 다리에 올라 갈 때'이다. 즉, 현재 트럭(now)가 다리에 올라가는 로직을 수행하도록 break문을 걸어 주는 것이다. 반복문은 단순히 조건만 따지는 것이고, 실제로 다리 위로 트럭을 올리려면 break를 걸어 조건 밖으로 나가 현재 상태(현재 코드)를 적용시키기 위함이다.

queue에 0을 추가하고 난 후에 break를 걸지 않는 이유는 현재 트럭(now)가 아직 다리에 올라가지 않았기 때문이다.

그리고 가장 마지막까지 남은 트럭이 다리 길이를 통과해야 하므로 다리 길이만큼의 시간을 추가해 주어야 한다.

import java.util.*;

class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int length = truck_weights.length;
        int sum = 0; //다리 위에 올라간 트럭의 전체 무게
        int time = 0; //걸린 시간 -> 트럭이 다리 위에 올라간 경우에만 증가시켜야함
        Queue<Integer> queue = new LinkedList<>();
        for(int i=0; i<length; i++){
            int now = truck_weights[i]; //현재 트럭
            while(true){
                if(queue.isEmpty()){ //다리가 빈 경우 -> 아무거나 올라갈 수 있음
                    queue.add(now);
                    sum = sum + now; //트럭의 무게 추가
                    time++;
                    break;
                }else if(queue.size() == bridge_length){ //길이가 꽉 찬 경우
                    int now2 = queue.poll(); //맨 위에서 제거
                    sum = sum - now2; //무게 제거
                }else{ //길이가 남은 경우
                    if(now + sum <= weight){ //무게가 가능하면
                        queue.add(now);
                        sum = sum + now;
                        time++;  
                        break;
                    }else{
                        queue.add(0);
                        time++;
                    }
                }
            }
        }
        return time + bridge_length;
    }
}

profile
컴퓨터가 이해하는 코드는 바보도 작성할 수 있다. 사람이 이해하도록 작성하는 프로그래머가 진정한 실력자다. -마틴 파울러

0개의 댓글