[lv.2] 다리를 지나는 트럭

RTUnu12·2024년 2월 19일
0

Programmers

목록 보기
10/41

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

  • 문제
    weight만큼의 무게를 지탱할 수 있는 length 길이의 다리에 고유의 무게를 가진 트럭들이 지나간다. 이때 무게 초과 및 길이 초과를 하지 않고 모든 트럭이 지나갈 때 최소 몇 초가 걸리는가?

  • 풀이
    우선, 설명이 좀 많이 부족하다. 다리를 이렇게 생각하자.
    length개의 칸으로 이루어진 다리, 1초에 1칸씩 트럭이 이동 가능하다.
    이제 구현을 어떻게 할 것인가?
    1) 우선 빈칸을 전부 0으로 채운다.
    2) 현재 무게+올라탈 무게를 계산한다. 당연하게도 1)의 행동으로 이미 다리는 꽉찬 상태에서 시작한다. 즉 길이는 신경쓰지 않아도 된다.
    3) 무게초과가 되지 않을 경우 앞을 빼고 현재 트럭을 넣는다.
    4) 무게초과가 될 경우 peek()가 0이 아닐때까지 cnt++ 및 poll(), 이후 더이상 무게초과가 되지 않을 때까지 트럭을 빼낸다. 이후 집어 넣는다.
    5) 모든 for문이 끝나면 다리는 마지막 트럭이 들어온 상태인데, 즉, 마지막 트럭이 빠져나가기의 시간, 다리의 길이를 cnt에 더해준 상태로 리턴한다.

  • 소감
    와 이게 어케 lv2? 문제도 설명이 불친절한데 로직도 간단하지 않다.

  • 코드

import java.util.*;

class Solution {
    public int solution(int length, int weight, int[] truck) {
        int cnt = 0;
        Queue<Integer> queue = new LinkedList<>();
        int nowWei = 0;
        for(int i=0; i<length; i++){
            queue.add(0);
        }
        for(int i=0; i<truck.length; i++){
            int now = truck[i];
            if(nowWei+now<=weight){
                nowWei -= queue.poll();
                nowWei += now;
                queue.add(now);
                cnt++;
            }
            else{
                while(queue.peek()==0){
                    queue.poll();
                    cnt++;
                    queue.add(0);
                }
                while(now+nowWei>weight){
                    nowWei -= queue.poll();
                    cnt++;
                    if(now+nowWei>weight) queue.add(0);
                }
                queue.add(now);
                nowWei += now;
            }
        }

        return cnt+length;
    }
}
profile
이제 나도 현실에 부딪힐 것이다.

0개의 댓글