택배상자_복습

하이솝·약 12시간 전

2026.09.02

문제 풀이

1차 실행 오류


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분
시간 복잡도: O(n)O(n)


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

AI 코드


시간 복잡도: O(n)O(n)


코드 분석

전체적인 구조는 동일하다.

바깥쪽 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; // 실은 상자 개수 = 처리한 주문 개수
    }
}

문제 풀이 후기

나의 코드에서 answeridx가 가리키는 값이 항상 일치하기 때문에
둘 중 하나만 사용하면 된다.

1차에서 실패한 코드를 보고 로직이 너무 꼬여 있다는 생각이 들었다.
좀 더 단순화해서 풀 수 있는 방법이 없을까? 고민하다가
서브 컨테이너 벨트에 계속 다 넣고, 들어가 있는 상자가 현재 실어야 하는 순서의 상자이면 빼는 방식으로 코드를 작성하였다.

0개의 댓글