- C++ 코드카타
- 언리얼 Collision, Trace, Damage 강의 수강
- Ch3 개인 프로젝트
오늘의 코드카타 문제는 다음과 같다.
프로그래머스(택배상자): https://school.programmers.co.kr/learn/courses/30/lessons/131704
지문이 프로그래머스 답지 않게 너무 길었는데, 요약하자면 다음과 같다.
지문이 좀 길었을 뿐, 문제가 직관적인 힌트를 주고 있다.
첫 번째 예시인 [4, 3, 1, 2, 5]의 상황이라고 가정하자.
처음에는 메인 컨테이너에 1~5까지의 택배 상자가 배치되어 있다.

처음 순서는 4번 택배 상자를 먼저 올려야 하므로, 1, 2, 3번 택배 상자를 보조 컨테이너에 싣고 4번 상자를 올려놓는다.

그 다음 순번인 3번은 보조 컨테이너에서 맨 뒤에 위치하므로, 바로 꺼내서 올려놓는다.

그 다음 순번인 1번은 보조 컨테이너의 뒤에서나, 메인 컨테이너의 앞에서나 1번 택배 상자가 없으므로 그대로 트럭은 출발한다.

이때, 중요한 부분은 어디 컨테이너부터 상자를 꺼낼 지가 문제이다.
만약, 메인 컨테이너부터 상자를 꺼낸다면 위의 예제처럼 3을 꺼내야 할 때 보조 컨테이너 맨 뒤에 위치해있음에도 불구하고 5를 옮겨버려서 문제가 발생한다.
즉, 보조 컨테이너 -> 메인 컨테이너 순으로 확인해야 한다.
#include <string>
#include <vector>
#include <stack>
#include <queue>
using namespace std;
int solution(vector<int> order) {
int answer = 0;
stack<int> sub_container; // 보조 컨테이너
queue<int> main_container; // 메인 컨테이너
for (int i = 0; i < order.size(); ++i)
{
main_container.push(i + 1); // 1 ~ n만큼의 상자를 채워넣기
}
for (int i = 0; i < order.size(); ++i)
{
int cur_order = order[i];
// 보조 컨테이너부터 확인
if (!sub_container.empty() && sub_container.top() == cur_order)
{
answer++;
sub_container.pop();
continue;
}
// 보조에도 없다면 메인에서 계속 꺼내보기
while(!main_container.empty() && cur_order != main_container.front())
{
sub_container.push(main_container.front());
main_container.pop();
}
if (!main_container.empty() && main_container.front() == cur_order)
{
answer++;
main_container.pop();
continue;
}
// 여기까지 오면 보조/메인 둘 다 없는 것이므로 바로 트럭 출발하기
break;
}
return answer;
}