본문 바로가기

백준

백준18115 - 카드 놓기

https://www.acmicpc.net/problem/18115

 

18115번: 카드 놓기

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

www.acmicpc.net

deque를 이용하여 해결한 문제이다. deque를 선택한 이유는 문제에서는 맨 앞이나 맨 뒤나 맨 뒤에서 2번째 수를 뽑아내는 연산을 하고 있어서 deque를 선택하였다. 주어진 입력과 반대로 거슬러 올라가면서 추리한다. 

 

주어진 입력이 1인 경우는 맨 뒤에 원소를 넣어준다.

 

주어진 입력이 2인 경우는 맨 뒤에 원소를 빼내어 어딘가에 저장해두었다가 현재 넣어야 하는 수를 맨 뒤에 넣고 다시 빼낸 원소를 맨 뒤에 넣는다.

 

주어진 입력이 3인 경우는 맨 앞에 원소를 넣어준다.

 

주어진 원소의 시작은 1로 설정한다. 왜냐하면 5 4 3 2 1에서 마지막으로 뽑히는 원소는 1이기 때문이다. 

#include <iostream>
#include <deque>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int n, x;
    int input;
    vector<int> v;
    deque<int> dq;
    
    cin >> n;
    for(int i = 0; i < n; i++) {
        cin >> x;
        v.push_back(x);
    }
    
    input = 1;
    
    reverse(v.begin(), v.end());
    
    for(int i = 0; i < n; i++) {
        if(v[i] == 1) {
            dq.push_back(input);
        }
        else if(v[i] == 2) {
            int temp = dq[dq.size() - 1];
            dq.pop_back();
            dq.push_back(input);
            dq.push_back(temp);
        }
        else if(v[i] == 3) {
            dq.push_front(input);
        }
        input++;
    }
    
    while(!dq.empty()) {
        cout << dq[dq.size() - 1] << ' ';
        dq.pop_back();
    }
}

'백준' 카테고리의 다른 글

백준1062 - 가르침  (0) 2020.07.06
백준1089 - 엘리베이터  (0) 2020.06.14
백준1174 - 줄어드는 숫자  (0) 2020.06.12
백준2780 - 비밀번호  (0) 2020.06.07
백준17178 - 줄서기  (0) 2020.06.04