코딩테스트

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

 

 

주저리

사실 어렵지 않은 문제인데 코드가 뜻대로 안 굴러가서 고생 좀 했다. 며칠 코딩 안 했다고 바보 된 기분이다.