코딩테스트
[JS] 택배상자
미안하다 강림이 좀 늦었다
2024. 1. 22. 20:01
난이도: Lv. 2
정답률: 55%
문제: https://school.programmers.co.kr/learn/courses/30/lessons/131704
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
알고리즘
1. 메인 스택을 n부터 1까지 1씩 감소하는 원소들로 초기화한다.
2. while문을 돌며 상자 번호를 확인한다.
2-1. 메인 스택의 마지막 상자가 현재 실어야 하는 상자와 동일한 경우
2-2. 서브 스택의 마지막 상자가 현재 실어야 하는 상자와 동일한 경우
2-3. 서브 스택의 마지막 상자 번호가 현재 실어야 하는 상자 번호보다 큰 경우
2-4. 메인 스택의 마지막 상자를 서브 스택으로 옮겨야 하는 경우
2-1과 2-2의 경우는 트럭에 실으면 되므로 정답을 증가시킨다.
2-3의 경우는 더 이상 트럭에 택배를 실을 수 없으므로 반복문을 벗어난다.
2-4의 경우는 상자를 보조 컨테이너 벨트로 옮기면 트럭에 상자를 더 실을 수 있으므로 메인 스택의 마지막 원소를 서브 스택으로 이동시킨다.
코드
function solution(order) {
let answer = 0;
const mainStack = Array.from({ length: order.length }, (v, i) => { return order.length - i });
const subStack = [];
let idx = 0;
while (idx < order.length) {
if (mainStack.length && mainStack[mainStack.length - 1] === order[idx]) {
mainStack.pop(); answer++; idx++;
} else if (subStack.length && subStack[subStack.length - 1] === order[idx]) {
subStack.pop(); answer++; idx++;
} else if (subStack.length && subStack[subStack.length - 1] > order[idx]) {
break;
} else if (mainStack.length) {
subStack.push(mainStack.pop());
}
}
return answer;
}
주저리
사실 어렵지 않은 문제인데 코드가 뜻대로 안 굴러가서 고생 좀 했다. 며칠 코딩 안 했다고 바보 된 기분이다.