본문 바로가기
알고리즘/프로그래머스

(LEVEL 2)프로그래머스 - 다리를 지나는 트럭(JAVA)

by 꾸준함 2023. 2. 25.

문제



입출력 예


풀이.

1. 선입선출(FIFO)의 구조를 가진 큐를 사용하여 다리위에 올라가있는 트럭들의 무게를 더해줄 변수 sum 선언

2. 큐가 비어있을 때 / 비어있지 않을 때로 나누어서 진행

  2-1. 비어 있다면 q에 삽입후 시간 1초 증가

  2-2. 큐에 들어간 트럭의 수(q의 사이즈) 가 다리 길이와 같다면 큐에서 빼주고 sum에서 빼줌

  2-3. 트럭을 추가 했을 때 최대 무게를 초과 한다면 0을 삽입하고 시간 증가

  2-4. 최대 무게 이내일 경우 q에 삽입후 시간 1초 증가

3. 마지막에 올라간 트럭이 시간이 지나간 시간이 더해지지 않고 종료 되기 때문에 다리길이만큼 시간을 더해준 값을 리턴.

 

 


코드

import java.util.*;

class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int answer = 0;
        
        Queue<Integer> q = new LinkedList<>();
        int sum = 0;    //다리를 건너는 트럭 무게 합
        
        for(int t : truck_weights){
            
            while(true){
                //큐가 비어 있으면 다음 트럭
                if(q.isEmpty()){
                    q.offer(t);
                    sum += t;
                    answer++;
                    break;
                }
                //큐의 사이즈랑 다리 길이가 같으면 처음값을 빼내고 sum에서 빼준다.
                else if(q.size() == bridge_length){
                    sum -= q.poll();
                }else{  //큐가 비어있지않을경우
                    if(sum + t > weight){
                        q.offer(0);
                        answer++;
                    }else{
                        q.offer(t);
                        sum+=t;
                        answer++;
                        break;
                    }
                }
            }
        }
        
        return answer + bridge_length;
    }
}