728x90
프로그래머스 고득점 kit 스택/큐 문제인 다리를 지나는 트럭 문제다.
백준에서 풀어봤던 적이 있던 문제라 어렵지 않게 풀 수 있었다.
다만 처음 접하는 경우 까다로운 조건이 몇 개 있어서 좀 어려울 수도 있다.
✅ 핵심 풀이
먼저 다리의 길이만큼 큐에 0을 넣었다.
트럭 한 개가 다리 길이 1만큼을 차지 하므로 트럭이 올라가지 않은 다리는 0으로 두는 것이다.
q.poll() == 0 인 경우 지나간 트럭은 없고 q.poll() q.add() 해줄 때 마다 큐에 존재하는
트럭이 왼쪽으로 이동하므로 이 방법을 사용 하면 전체 다리 길이와 트럭이 다리를 건너는 시점을
따로 신경쓰지 않아도 된다.
그리고 truck_weights의 마지막 인덱스 값이 큐에 넣어진 경우
해당 트럭이 나갈때까지 q.poll() q.add(0) 할 필요 없이 while 반복문을 break 해주고
지금까지의 시간을 담은 answer 과 다리 길이(마지막 트럭이 건너는데 필요한 시간) 를
더한 값을 return 해주면 된다.
중간에 큐에 들어있는 다른 트럭들을 신경 쓸 필요가 없고
마지막 트럭이 나가는데 필요한 시간 = 다리 길이가 되기 때문이다.
🚨 CODE
import java.util.*;
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
int answer = 0;
Queue<Integer> q = new LinkedList<>();
// 큐 초기화
for(int i = 0; i<bridge_length; i++) {
q.add(0);
}
int curW = 0; // 다리의 현재 무게
int idx = 0; // 다리를 건널 차례
while(true) {
curW -= q.poll();
// 현재 무게가 제한 무게를 초과하지 않고 idx가 트럭 배열 길이 보다 작으면
if(curW + truck_weights[idx] <= weight && idx < truck_weights.length) {
q.add(truck_weights[idx]); // 트럭 지나가기 시작
if(idx == truck_weights.length - 1) { // 마지막 트럭인지 확인
answer++;
break;
}
curW += truck_weights[idx]; // 현재 무게 갱신
idx++;
}else
q.add(0); // 무게 제한에 걸려 다음 트럭이 못 올라오면 add 0
answer++;
}
return answer + bridge_length;
}
}
728x90
반응형
'코딩테스트' 카테고리의 다른 글
[JAVA] 백준 - 11659 구간 합 구하기 4 (0) | 2024.01.29 |
---|---|
[JAVA] 프로그래머스 - 피로도 (0) | 2024.01.22 |
[JAVA] 프로그래머스 - 베스트 앨범 (0) | 2024.01.10 |
[JAVA] 백준 - 14620 꽃길 (feat. JAVA 얕은 복사, 깊은 복사) (0) | 2024.01.10 |
[JAVA] 프로그래머스 - 의상 (0) | 2024.01.09 |