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;
}
}