🧫 문제 분석
✔️ 출처
📖 문제

2번 재시도 끝에 풀은 문제다.
처음 시도에는
다리 위에 올라간 트럭이 경과한 시간을 잘 못 설계해서 계속 틀렸다.
두 번째 시도는
조건문 하나를 추가하지 않아서 틀렸었다. 4,5,6,9번
다리위에 있는 트럭을 제거해야하는 경우의 수는
1. 다리에 트럭이 현재 올라갈 수 있는 트럭 최대 갯수만큼 있는 경우
2. 새로운 트럭이 올라간다 했을 때 무게 하중을 넘어가는 경우
3. 위 두 경우와는 별개로 다리의 맨 앞 트럭이 다리를 다 건너(시간이 지나) 빠져나가는 경우
이 세가지 경우에 대해서 트럭을 잘 빼준다면 문제없이 쉽게 풀 수 있을 것이다.
나는 3번을 안해서 계속 틀렸었다..
🔅 문제 풀이
import java.util.*;
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
Queue<int[]> q = new LinkedList<>();
int sumWeight = 0;
int curTime = 0; // 현재 시간
for (int i = 0; i < truck_weights.length; i++) {
curTime++; // 매초가 상승
while(!q.isEmpty()) {
// 트럭이 올라갈 수 있는 최대 갯수이거나, 무게를 초과하면
if (q.size() == bridge_length || sumWeight + truck_weights[i] > weight || bridge_length == curTime - q.peek()[1]) {
int[] truck = q.poll();
sumWeight -= truck[0]; // 맨 앞 트럭을 빼주고
curTime += bridge_length - (curTime - truck[1]); // 맨 앞 트럭이 빠진 시간을 현재 시간에 더함
}else {
break;
}
}
// 트럭을 다리에 추가
q.add(new int[] {truck_weights[i], curTime});
sumWeight += truck_weights[i];
}
// 다리에 남은 트럭들 처리
while (!q.isEmpty()) {
int[] truck = q.poll();
sumWeight -= truck[0];
curTime += bridge_length - (curTime - truck[1]);
}
return curTime;
}
}

다른 사람 풀이중 인기 많은 것도 이해해보고 돌려봤는데 생각보다 오래걸렸다.
그래서 내 풀이에 만족하려한다.
❗ 오답노트 / 필요한 지식
- 테스트 케이스를 잘 만드는 것도 능력
- 항상 예외 상황을 생각
'programmers > Lv 2' 카테고리의 다른 글
테이블 해시 함수 [자바] (0) | 2025.02.11 |
---|---|
행렬 테두리 회전하기 [자바] (0) | 2025.02.11 |
숫자 카드 나누기 [자바] (1) | 2025.02.01 |
호텔 대실 [자바] (1) | 2025.02.01 |
마법의 엘리베이터 [자바] (0) | 2025.01.30 |