2026.09.02
50.0/100
실패 및 런타임 에러
import java.util.Deque;
import java.util.ArrayDeque;
class Solution {
public int solution(int[] orders) {
int cur = 1;
int answer = 0;
Deque<Integer> sub = new ArrayDeque<>();
int idx = 0;
while(true) {
if (idx >= orders.length || cur > orders[idx] && sub.peek() > orders[idx]) {
break;
}
if (cur == orders[idx]) { // 현재 꺼낸 상자가 이번 순서인 경우
answer++;
idx++;
}
else if (!sub.isEmpty() && sub.peek() == orders[idx]) {
// 보조 컨테이너 벨트의 상자가 이번 순서인 경우
answer++;
idx++;
sub.pop();
}
else { // 현재 꺼낸 상자가 이번 순서가 아닌 경우
sub.push(cur); // 보조 컨테이너 벨트에 삽입
}
cur++;
}
return answer;
}
}
소요 시간: 38분
시간 복잡도:
import java.util.Deque;
import java.util.ArrayDeque;
class Solution {
public int solution(int[] orders) {
int cur = 1;
int answer = 0;
Deque<Integer> sub = new ArrayDeque<>();
int idx = 0;
while(true) {
if (!sub.isEmpty() && sub.peek() == orders[idx]) {
sub.pop();
answer++;
idx++;
}
else sub.push(cur++);
if (idx >= orders.length || !sub.isEmpty() && sub.peek() > orders[idx]) break;
}
return answer;
}
}
시간 복잡도:
코드 분석
전체적인 구조는 동일하다.
바깥쪽 for문을 이용해서 orders의 길이만큼 반복하고
안쪽의 while문을 이용해서 서브 컨테이너 벨트에서
택배 상자를 빼는 작업을 분할해서 진행한 코드이다.
import java.util.Deque;
import java.util.ArrayDeque;
class Solution {
public int solution(int[] orders) {
int n = orders.length;
Deque<Integer> sub = new ArrayDeque<>(); // 보조 컨테이너
int idx = 0; // 다음에 실어야 할 주문 위치
for (int box = 1; box <= n; box++) {
sub.push(box); // 컨테이너 벨트에서 상자 하나 올림
// 꼭대기가 원하는 상자인 동안 계속 트럭에 실음
while (idx < n && !sub.isEmpty() && sub.peek().intValue() == orders[idx]) {
sub.pop();
idx++;
}
}
return idx; // 실은 상자 개수 = 처리한 주문 개수
}
}
나의 코드에서 answer와 idx가 가리키는 값이 항상 일치하기 때문에
둘 중 하나만 사용하면 된다.
1차에서 실패한 코드를 보고 로직이 너무 꼬여 있다는 생각이 들었다.
좀 더 단순화해서 풀 수 있는 방법이 없을까? 고민하다가
서브 컨테이너 벨트에 계속 다 넣고, 들어가 있는 상자가 현재 실어야 하는 순서의 상자이면 빼는 방식으로 코드를 작성하였다.