⛔ 단순히 기록용 입니다... 어떻게 풀었는가 생각도 다시 해보고 그러니까 아마도 도움은 안되실 것 같습니다.
각 명령에 따라서 구현을 진행하면 되는 문제입니다. 하지만, 문제를 천천히 읽어보면? 카드는 [5,4,3,2,1]로 쌓여야합니다. 그리고 각 명령이 앞에서도 빼고 뒤에서도 빼고 중간에서도 빼는 그러한 문제이기 때문에 자료구조는 deque을 사용하기로 했습니다. 문제를 해결하면서 주어진 입력대로 하면 될것 같지만? 카드를 되돌리기 위해선? 거꾸로 진행을 해야하지 않나 생각을 했지만, 일단 정방향대로 문제를 해결하려했습니다. 하지만, 그렇게되면? 뒤에서 뽑아온 숫자들은 순서가 반대가 되기 때문에 뽑아왔던 순서에서 반대로 진행하면서 다시 원상복귀를 시켜야합니다.
생각을 할 수 있겠죠? 거꾸로 하면 그대로 카드가 다시 쌓인다는것? 아래는 정답코드입니다.
#include<iostream>
#include<queue>
#define MAX 1000100
using namespace std;
int n,board[MAX];
deque<int> dq;
void init() {
cin >> n;
for(int i = 0; i < n; i++) cin >> board[i];
}
void solve() {
// 첫번째 뽑히는게 n 번 그다음이 n - 1 .... 1까지
int order;
for(int i = n; i > 0; i--){
order = board[i - 1];
int number = n - i + 1;
if(order == 1){
// 맨앞에 넣어주기
dq.push_front(number);
} else if(order == 2) {
// 앞에 하나 빼고 넣고, 다시 넣기
if(dq.size()) {
int temp = dq.front();
dq.pop_front();
dq.push_front(number);
dq.push_front(temp);
} else{
dq.push_front(number);
}
} else if(order == 3){
dq.push_back(number);
}
}
}
int main() {
init();
solve();
while(!dq.empty()){
cout << dq.front() << " ";
dq.pop_front();
}
return 0;
}
'PS > BaekJoon' 카테고리의 다른 글
[C++/27438] 행렬 연산 (0) | 2024.07.10 |
---|---|
[C++/26168] 배열 전체 탐색하기 (0) | 2024.07.04 |
[C++/28066] 타노스는 요세푸스가 밉다. (0) | 2024.06.30 |
[C++/28256] 초콜릿 보관함 (0) | 2024.06.27 |
[C++/2115] 갤러리 (0) | 2024.06.20 |