일단 이문제는 큐를 이용해야 하는 문제라 linkedList를 사용해야 한다 1시간 이상 무조건 넘어가면 극도로 피곤해지므로 알고리즘이 확연히 떠오르지 않아서 몇번 검색 해서 찾아보았다
import java.util.*;
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
int answer = 0;
int sum = 0;
LinkedList<Integer> ll = new LinkedList<Integer>();
for(int i = 0; i < truck_weights.length; i++) {
int truck = truck_weights[i];
while(true) {
if (ll.isEmpty()) {
ll.add(truck);
answer++;
sum += truck;
break;
} else if (ll.size() == bridge_length) {
sum -= ll.poll();
} else if (sum + truck > weight) {
ll.add(0);
answer++;
} else {
ll.add(truck);
answer++;
sum += truck;
break;
}
}
}
return answer + bridge_length;
}
}
일단 이 답안의 코드 설명은 어디에나 다 나와있는 것이고 이것이 그렇게 중요하다 생각하지 않는다.
이문제에서 가장 주목해야 한다고 생각하는건 while 안에 있는 if문의 순서다 모두가 알다시피 ifelse문은 여러가지 문맥이 있지만 단 한군대만 들리고 나머지가 해당되더라도 처음에 해당되는 해당되는 문이 아니라면 내용을 실행하지 않고 넘어간다는 점이다.
이 내용들은 큐이기 때문에 이 실행순서로 작동해야 한다.
이것은 어떤 풀이든 간에 이 순서로밖에 진행할 수 없는 것이다.
특히 저 0을 offer 하는 것은 정말 충격이었다. 이 큐가 full 이 된지 알려면 무조건 이 큐의 현재 무게를 담는 sum이 필요하다고 생각은했지만 제일 앞에 있는 큐가 어디에 위치하고 있는지 알려면 ll.size()가 필요 한데, 이는 offer(0) 없이는 이렇게 간단한코드로 불가능하기 때문이다.