알고리즘 문제

백준 - 10866번 덱 (C++)

als982001 2023. 3. 27. 22:44

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

 

10866번: 덱

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

 이번 문제는 덱에 관한 명령어들이 주어졌을 때, 이것들에 대한 결과를 출력하는 문제이다. 덱은 마치 스택과 큐가 합쳐진 것처럼 데이터를 앞에서도 넣었다 뺄 수 있고 뒤에서도 넣었다 뺄 수 있는 자료구조이다. 마치 바닥에 구멍이 뚫린 프링글스 통처럼 위아래(혹은 앞뒤) 구멍이 없는 느낌이다. 그렇기에 문제를 봐도 알 수 있듯이 명령어가 꽤 많은 편이다. 이 문제도 직접 덱을 구현해서 풀면 좋겠지만, C++에는 deque 라이브러리가 있기 때문에 그냥 이것을 이용하여 문제를 풀었다.

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
#include <queue>
#include <memory.h>
#include <deque>
#include <cmath>
#include <stack>
#include <cstring>
#include <typeinfo>
#include <iomanip>
#include <limits.h> 
#include <map>
#pragma warning(disable:4996)

using namespace std;

#define PUSH_FRONT "push_front"
#define PUSH_BACK "push_back"
#define POP_FRONT "pop_front"
#define POP_BACK "pop_back"
#define SIZE "size"
#define EMPTY "empty"
#define FRONT "front"
#define BACK "back"

int N;
string input;
deque<int> dq;
vector<int> answer;

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

	cin >> N;
	cin.ignore();

	for (int i = 0; i < N; ++i)
	{
		getline(cin, input);

		istringstream command(input);

		string cmd, strNum;
		command >> cmd >> strNum;

		if (cmd == PUSH_FRONT)
		{
			int num = stoi(strNum);
			dq.push_front(num);
		}
		else if (cmd == PUSH_BACK)
		{
			int num = stoi(strNum);
			dq.push_back(num);
		}
		else if (cmd == POP_FRONT)
		{
			int num;

			if (dq.empty())
				num = -1;
			else
			{
				num = dq.front();
				dq.pop_front();
			}

			answer.push_back(num);
		}
		else if(cmd == POP_BACK)
		{
			int num;

			if (dq.empty())
				num = -1;
			else
			{
				num = dq.back();
				dq.pop_back();
			}

			answer.push_back(num);
		}
		else if (cmd == SIZE)
		{
			int size = dq.size();
			answer.push_back(size);
		}
		else if (cmd == EMPTY)
		{
			int isEmpty = dq.empty() ? 1 : 0;
			answer.push_back(isEmpty);
		}
		else if (cmd == FRONT)
		{
			int num = dq.empty() ? -1 : dq.front();
			answer.push_back(num);
		}
		else if (cmd == BACK)
		{
			int num = dq.empty() ? -1 : dq.back();
			answer.push_back(num);
		}
	}

	for (int i = 0; i < answer.size(); ++i)
		cout << answer[i] << endl;

    return 0;
}