알고리즘
[Javascript] 프로그래머스 - 택배상자
J3SUNG
2025. 3. 9. 19:35
728x90
문제 설명
컨테이너 벨트에서 주어진 순서대로 택배 상자를 트럭에 실어야 합니다. 하지만 컨테이너 벨트는 한 방향으로만 진행되며, 원하는 순서대로 적재할 수 없는 경우 보조 컨테이너 벨트를 사용해야 합니다. 보조 컨테이너 벨트는 스택(Stack) 구조로, 가장 최근에 보관한 상자부터 꺼낼 수 있습니다. 이를 이용해 최대한 많은 상자를 트럭에 실을 수 있는 개수를 구하는 문제입니다.
제한 사항
- order의 길이는 1 이상 1,000,000 이하입니다.
- order 배열에는 1부터 order.length까지의 정수가 한 번씩 등장합니다.
- order[i]는 order[i] 번째 상자를 i+1 번째로 트럭에 실어야 함을 의미합니다.
해결 방법
알고리즘: 스택을 활용한 그리디 알고리즘
- 컨테이너 벨트에서 상자를 하나씩 확인하며, 현재 트럭에 실어야 하는 순서(order)와 비교합니다.
- 만약 현재 상자가 order에 해당하면 즉시 트럭에 적재합니다.
- 그렇지 않다면, 보조 컨테이너 벨트(스택)에 저장합니다.
- 상자를 실을 때마다 보조 컨테이너 벨트의 마지막 값과 order를 비교하여 순서가 맞다면 꺼내어 적재합니다.
- 위 과정을 반복하여 최대한 많은 상자를 적재합니다.
시간 복잡도
- 각 상자는 한 번만 컨테이너 벨트에서 확인되고, 보조 컨테이너 벨트(스택)에 push 및 pop 연산이 수행됩니다.
- 모든 연산은 상자 개수(n)에 대해 O(1)의 시간 복잡도로 이루어지므로 전체 시간 복잡도는 O(n) 입니다.
구현 코드
function solution(order) {
const stack = [];
let answer = 0;
let orderIndex = 0;
const n = order.length;
for (let i = 1; i <= n; i++) {
if (i === order[orderIndex]) {
answer++;
orderIndex++;
while (stack.length && stack[stack.length - 1] === order[orderIndex]) {
stack.pop();
answer++;
orderIndex++;
}
} else {
stack.push(i);
}
}
return answer;
}