본문 바로가기
Study (etc)/Problem Solving

[ BOJ / C++] 18115번 : 카드 놓기

by Haren 2022. 5. 3.

문제

수현이는 카드 기술을 연습하고 있다. 수현이의 손에 들린 카드를 하나씩 내려놓아 바닥에 쌓으려고 한다. 수현이가 쓸 수 있는 기술은 다음 3가지다.

  1. 제일 위의 카드 1장을 바닥에 내려놓는다.
  2. 위에서 두 번째 카드를 바닥에 내려놓는다. 카드가 2장 이상일 때만 쓸 수 있다.
  3. 제일 밑에 있는 카드를 바닥에 내려놓는다. 카드가 2장 이상일 때만 쓸 수 있다.

수현이는 처음에 카드 N장을 들고 있다. 카드에는 1부터 N까지의 정수가 중복되지 않게 적혀 있다. 기술을 N번 사용하여 카드를 다 내려놓았을 때, 놓여 있는 카드들을 확인했더니 위에서부터 순서대로 1, 2, …, N이 적혀 있었다!

놀란 수현이는 처음에 카드가 어떻게 배치되어 있었는지 궁금해졌다. 처음 카드의 상태를 출력하여라.

입력

첫 번째 줄에는 N (1 ≤ N ≤ 106)이 주어진다.

두 번째 줄에는 길이가 N인 수열 A가 주어진다. Ai가 x이면, i번째로 카드를 내려놓을 때 x번 기술을 썼다는 뜻이다. Ai는 1, 2, 3 중 하나이며, An은 항상 1이다.

출력

초기 카드의 상태를 위에서부터 순서대로 출력하여라.

Solved.ac 레벨

실버 III

풀이

#include <bits/stdc++.h>

using namespace std;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    vector<int> vec;
    deque<int> dq;
    string str;

    int n;
    cin >> n;

    for(int i = 0; i < n; i++){
        int ch;
        cin >> ch;
        vec.push_back(ch);
    }
    reverse(vec.begin(), vec.end());

    for(int i = 1; i <= n; i++){
        if(vec[i-1] == 1){
            dq.push_front(i);
        } else if(vec[i-1] == 2){
            int temp = dq.front();
            dq.pop_front();
            dq.push_front(i);
            dq.push_front(temp);
        } else if(vec[i-1] == 3){
            dq.push_back(i);
        }
    }
    while(!dq.empty()){
        cout << dq.front() << ' ';
        dq.pop_front();
    }
    cout << '\n';

    return 0;
}
 

18115번: 카드 놓기

수현이는 카드 기술을 연습하고 있다. 수현이의 손에 들린 카드를 하나씩 내려놓아 바닥에 쌓으려고 한다. 수현이가 쓸 수 있는 기술은 다음 3가지다. 제일 위의 카드 1장을 바닥에 내려놓는다.

www.acmicpc.net

 

'Study (etc) > Problem Solving' 카테고리의 다른 글

[BOJ / C++] 2346번 : 풍선 터뜨리기  (0) 2022.05.03
[BOJ / C++] 10250번 : ACM 호텔  (0) 2022.05.03
[BOJ / C++] 2798번 : 블랙잭  (0) 2022.05.03
[BOJ / C++] 5379번 : 키로거  (0) 2022.05.01
[BOJ / C++] 2475번 : 검증수  (0) 2022.04.28