⌨️CS-PS/백준_자료구조[DS]

[Baekjoon/백준][18258][C/C++] 큐 2

미르의 블로그 2023. 5. 3. 01:31
728x90
반응형
『목차』
0. 개요

1. 문제
2. 풀이
3. 코드

0. 개요

자료구조, 큐 문제. '백준 10845 큐' 문제와 동일하지만 입력값의 수가 훨씬 크다.

1. 문제

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

 

18258번: 큐 2

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

www.acmicpc.net

[문제]

정수를 저장하는 큐를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 여섯 가지이다.

  • push X: 정수 X를 큐에 넣는 연산이다.
  • pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 큐에 들어있는 정수의 개수를 출력한다.
  • empty: 큐가 비어있으면 1, 아니면 0을 출력한다.
  • front: 큐의 가장 앞에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • back: 큐의 가장 뒤에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.

[입력]

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

[출력]

출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

[예제 입력 1]

15
push 1
push 2
front
back
size
empty
pop
pop
pop
size
empty
pop
push 3
empty
front

[예제 출력 1]

1
2
2
0
1
2
-1
0
1
-1
0
3

 

반응형

2. 풀이

큐 Class를 만든 후, 큐의 ADT를 직접 구현하는 방식으로 만들었다.

STL의 Queue를 이용해도 좋았겠지만, 공부 목적으로 직접 구현을 선택했다.

3. 코드

#include <iostream>
#include <string>
using namespace std;

class queue {
private:
	int* arr;

	int F;
	int R;

	const int max = 2000001;
public:
	/* Constructor & Destructor */
	queue() : F(0), R(0) {
		arr = new int[max]();
	}
	~queue() {
		delete[] arr;
	}
	/* Method */
	void push(int elem) {
		arr[++R] = elem;
	}
	int pop(void) {
		if (F == R)
			return -1;
		else
			return arr[++F];
	}
	int size(void) {
		return R - F;
	}
	int empty(void) {
		if (F == R)
			return 1;
		else
			return 0;
	}
	int front(void) {
		if (F == R)
			return -1;
		else
			return arr[F + 1];
	}
	int back(void) {
		if (F == R)
			return -1;
		else
			return arr[R];
	}
};

int main(int argc, char* argv[]) {
	/* Faster */
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	/* Init */
	queue q;

	/* Input */
	int N; cin >> N;
	for (int i = 0; i < N; i++) {
		string str; cin >> str;

		if (str == "push") {
			int elem; cin >> elem;
			q.push(elem);
		}
		else if (str == "pop") {
			cout << q.pop() << '\n';
		}
		else if (str == "size") {
			cout << q.size() << '\n';
		}
		else if (str == "empty") {
			cout << q.empty() << '\n';
		}
		else if (str == "front") {
			cout << q.front() << '\n';
		}
		else if (str == "back") {
			cout << q.back() << '\n';
		}
	}

	/* End */
	return 0;
}

/* 원형 큐 이용 안함 */
/* 10845 문제와 동일 (입력값 크기 차이) */
728x90
반응형