반응형
문제
택배상자
https://school.programmers.co.kr/learn/courses/30/lessons/131704
예시 코드
function solution(order) {
const stack = [];
let cur = 1;
let cnt = 0;
for (const box of order) {
while (cur <= box) {
stack.push(cur++);
}
if (stack.pop() !== box) return cnt;
cnt++;
}
return cnt;
}
풀이
택배 기사님이 원하는 상자 순서를 나타내는 정수 배열 order가 주어졌을 때, 영재가 몇 개의 상자를 실을 수 있는지를 구하는 문제입니다.
보조 컨테이너 벨트는 LIFO 방식으로 작동하므로, 스택을 사용해서 구현합니다.
상자를 싣는 과정은 다음과 같습니다.
- 컨테이너 벨트에서 차례로 상자를 꺼내, 트럭에 실어야 하는 순서와 비교합니다.
- 순서가 맞는 경우, 상자를 싣습니다.
- 순서가 잘못된 경우, 상자를 보조 컨테이너에 보관합니다.
- 컨테이너 벨트에서 찾지 못한 경우, 보조 컨테이너의 마지막 상자를 꺼냅니다.
- 현재 순서가 아닌 경우, 작업을 끝냅니다.
이를 코드로 나타내면 대략 이렇습니다.
for (const box of order) {
let found = false;
while (true) {
if (cur < box) {
stack.push(cur++);
} else {
cnt++;
found = true;
break;
}
}
if (found) continue;
if (stack.pop() !== box) return cnt;
cnt++;
}
실제 구현한 코드는 기존 과정을 조금 변형하여 작성했습니다.
- 컨테이너 벨트에서 차례로 상자를 꺼내, 보조 컨테이너에 집어넣습니다.
- 현재 순서인 상자가 나올 때까지 반복합니다.
- 보조 컨테이너의 마지막 상자를 꺼냅니다.
- 현재 순서가 아닌 경우, 작업을 끝냅니다.
'Coding Problem' 카테고리의 다른 글
[프로그래머스] 점프와 순간 이동 (0) | 2024.11.30 |
---|---|
[프로그래머스] 영어 끝말잇기 (1) | 2024.11.29 |
[프로그래머스] PCCP - 퍼즐 게임 챌린지 (0) | 2024.11.27 |
[프로그래머스] 줄 서는 방법 (0) | 2024.11.26 |
[프로그래머스] 리코쳇 로봇 (0) | 2024.11.25 |