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

김준영·2023년 3월 20일
1

코딩테스트

목록 보기
15/22

풀이


import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
class Solution {
    public int queueSum(Queue<Integer> queue) {
        int sum = 0;
        for(int n : queue) {
            sum += n;
        }
        return sum;
    }
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        Queue<Integer> bridge = new LinkedList<>();
        for(int i = 0; i < bridge_length; i++){
            bridge.add(0);
        }


        int time = 0;
        bridge.poll();
        bridge.add(truck_weights[0]);
        truck_weights = Arrays.copyOfRange(truck_weights, 1, truck_weights.length);
        time++;

        while(truck_weights.length != 0 || queueSum(bridge) != 0){
            if(truck_weights.length != 0){
                int sum = queueSum(bridge) + truck_weights[0];
                if(sum > weight){
                    bridge.poll();
                    sum = queueSum(bridge) + truck_weights[0];
                    if(sum <= weight){
                        bridge.add(truck_weights[0]);
                        truck_weights = Arrays.copyOfRange(truck_weights, 1, truck_weights.length);
                        time++;
                    }else{
                        bridge.add(0);
                        time++;
                    }
                }else{
                    bridge.poll();
                    bridge.add(truck_weights[0]);
                    truck_weights = Arrays.copyOfRange(truck_weights, 1, truck_weights.length);
                    time++;
                }
            }else{
                bridge.poll();
                bridge.add(0);
                time++;
            }
        }
        return time;
    }
}

기본적으로 수업 시간에 배운 프린터를 기반으로 작성

  1. 큐를 브릿지 길이와 0으로 초기화한다.
  2. 제일 첫 차를 큐에 넣어주고 배열 초기화.
  3. 시간++를 해준다.
  4. 배열에 값이 있거나 큐 안에 값이 0이 아닐 경우 while문을 돌게 한다.
  5. 배열에 값이 남아있을경우
    1. 배열 첫 번째 값과 큐 값들을 더해서 weight과 비교한다.
    2. 더한 값이 더 크면 값을 poll(), add(0), time++를 진행한다.
    3. 그렇지 않으면 큐 poll(), 배열 첫 값을 add() 해주고 time ++
  6. 배열에 값이 없을 경우, 큐 값만 계속 뽑고 0을 넣어줘서 while문 탈출.
💡 queue.stream.reduce(0, Integer::sum)을 사용할 경우, 테스트 케이스 5번에서 시간초과 발생

→ 큐를 더해주는 메서드를 생성해서 이 문제 해결.

profile
ㅎㅎ

0개의 댓글