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

구잉·2021년 10월 25일
0

https://programmers.co.kr/learn/courses/30/lessons/42583

풀기보다 내용을 이해하기 힘들었던 문제
직관적으로 생각하니 생각보다 쉽게 답이 나왔다

  1. 다리 위에 있지 않은 트럭들이 존재하는 wait 큐, 다리 위에 있는 트럭들이 존재하는 ing 큐를 생성한다.

  2. 다리 위에 존재하는 트럭 수가 다리 길이보다 짧고(ing.size() < bridge_length) 다리 위에 존재하는 트럭 무게 + 다음으로 다리로 올라올 트럭 무게가 견딜 수 있는 무게보다 적으면(ing_weight + wait.peek() <= weight) 다리 위로 트럭을 옮긴다.(ing.add(new ing_info(temp, 1));)

  3. 다리 위에 있는 트럭을 한칸씩 앞으로 옮겨준다.(n.time += 1;)

  4. 트럭이 다리를 다 지나가면 ing 큐에서 출력해준다.

  5. wait 큐에는 값이 존재하지않지만 ing큐에는 값이 존재할 수 있기 때문에 트럭이 다 지나갈 때까지 한칸씩 앞으로 옮겨준다.

import java.util.*;
class ing_info{
    int num;
    int time;
    
    public ing_info(int num , int time){
        this.num = num;
        this.time = time;
    }
}
class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int answer = 0;
        
        Queue<Integer> wait = new LinkedList<>();
        Queue<ing_info> ing = new LinkedList<>();
        
        for(int i = 0 ; i < truck_weights.length ; i++){
            wait.add(truck_weights[i]);
        }
        int ing_weight = 0;
        while(!wait.isEmpty()){
            answer++;
            ing_weight = 0;
            
            for(ing_info n : ing){
                ing_weight += n.num;
            }
                   
            if(ing.size() < bridge_length && ing_weight + wait.peek() <= weight){
                int temp = wait.poll();
                ing.add(new ing_info(temp, 1));
            }
            for(ing_info n : ing){
                n.time += 1;
            }
            while(true){
                ing_info out_truck;
                if(!ing.isEmpty()){
                    out_truck = ing.peek();    
                }
                else{
                    break;
                }
                
                if(out_truck.time != bridge_length+1){
                    break;
                }
                else{
                    ing.poll();
                }
            }
        }
        
        while(!ing.isEmpty()){
            
            ing_info bridge_on_truck = ing.peek();
            if(bridge_on_truck.time >= bridge_length+1){
                ing.poll();    
            }
            for(ing_info n : ing){
                n.time += 1;
            }
            
            answer++;
        }
        return answer;
    }
}
profile
시작을 두려워하지말자

0개의 댓글