Programmers/Level 2

C++ / 프로그래머스 / 택배상자

GitHubSeob 2023. 9. 8. 05:57
문제

 

https://school.programmers.co.kr/learn/courses/30/lessons/131704

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제풀이

 

경우의 수를 따져가며 풀어야 되는 문제인지 알고 조건을 여러 개 두어 풀었는데..

다른 풀이를 보니 스택에 다 집어넣고 pop 하면서 푸는 풀이가 있더라고요..

저는 제가 푼대로 풀이하겠습니다.

 

컨베이어 벨트의 맨 앞에 있는 박스를 box_num이라는 변수의 값으로 둔다.

보조 컨테이어 벨트를 나타내는 박스들을 stack을 이용해 표기한다.

(스택의 top부분이 보조 컨베이어 벨트에서 꺼낼 수 있는 상자)

현재 트럭에 실어야 하는 박스를 need라는 변수의 값으로 둔다.

 

    while (1) {
        if (order_idx >= N) break;
        need = order[order_idx];
        if (box_num > N && !stk.empty() && stk.top() != need) break;

 

 

만약 트럭에 모든 상자를 실었다면 반복문을 종료한다.

현재 실어야 하는 박스는 order의 order_idx번째에 있는 상자이다.

만약 컨베이어 벨트에서 모든 상자를 트럭에 싣든, 보조 컨테이어 벨트에 실어, 더 이상 꺼낼 박스가 없고, 보조 컨테이어의 맨 앞 박스가 필요한 박스가 아니라면 반복문을 종료한다.

 

        if (need == box_num) {
            ++order_idx;
            ++box_num;
            ++answer;
        }
        else if (!stk.empty() && stk.top() == need) {
            ++order_idx;
            ++answer;
            stk.pop();
        }
        else {
            stk.push(box_num++);
        }

컨베이어 벨트의 맨 앞 박스가 필요한 박스라면 order_idx, box_num, answer에 1씩 더해준다.

 

그렇지 않다면 보조 컨테이어를 살펴 맨 앞 박스가 필요한 박스라면 order_idx, answer에 1씩 더해준다. 그리고 pop을 한다. 이 때는 컨베이어벨트에서 박스를 꺼낸 것이 아니므로 box_num은 그대로 유지한다.

 

그 외의 경우는 보조 컨베이어 벨트에 넣는다. (stk.push)

이를 반복문이 종료될 때까지 반복한다.

 

반복문이 종료되면 더 이상 작업을 수행할 수 없는 상태이므로 answer을 return 한다.

 

 

코드
#include <string>
#include <vector>
#include <stack>
using namespace std;

int solution(vector<int> order) {
    int N = order.size();
    int order_idx(0), answer(0), need(0);
    stack<int>stk;

    int box_num = 1;
    while (1) {
        if (order_idx >= N) break;
        need = order[order_idx];
        if (box_num > N && !stk.empty() && stk.top() != need) break;
        if (need == box_num) {
            ++order_idx;
            ++box_num;
            ++answer;
        }
        else if (!stk.empty() && stk.top() == need) {
            ++order_idx;
            ++answer;
            stk.pop();
        }
        else {
            stk.push(box_num++);
        }
    }

    return answer;
}