본문 바로가기
백준

[10845] 큐

by kmyobin 2022. 11. 3.


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

 

10845번: 큐

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

www.acmicpc.net

큐를 직접 구현해보는 문제이다.

 

Queue : FIFO(First in First out), 먼저 들어간 데이터가 먼저 나와야함. 한방향 통행 가능!

 

 

구현해야 하는 함수 6가지만 선언해주었다.

template<class T> class MyQueue
{
public :
	int front; int rear; int size;
	T* values;

	MyQueue() {
		size = MAX;
		values = new T[size];
		front = 0; rear = 0;
	}

	~MyQueue() { delete[] values; }

	void push(T value) {
		values[rear] = value;
		rear++;
	}

	void pop() {
		if (!empty()) {
			cout << values[front] << "\n";
			front++;
		}
		else { // queue에 들어있는 정수가 없는 경우
			cout << -1 << "\n";
		}
	}

	void size_() { // 재정의 오류 발생
		cout << rear - front <<"\n";
	}

	bool empty() {
		if (front == rear) {
			return true;
		}
		else return false;
	}

	void front_() { // 재정의 오류 발생
		if (!empty()) cout << values[front] << "\n";
		else cout << -1 << "\n";
	}

	void back() {
		if (!empty()) cout << values[rear - 1] << "\n";
		else cout << -1 << "\n";
	}
};

size, front 함수같은 경우는 재정의 오류가 발생하여 함수 이름에 '_'를 붙여 다르게 만들어주었다.

아마 헤더파일에 있는 내장함수와 충돌한 듯 하다 ,,

front와 rear이 배열의 index를 가리켜주고, 이를 시시각각 움직여주면서 queue의 처음과 끝을 다루었다.

 

 

이렇게 한 다음 main문은 아래와 같다.

cin >> N;
	for (int i = 0; i < N + 1; i++) // getline 함수 때문에 자꾸 N-1만큼 입력을 받음,, 그래서 N만큼 반복하도록
	{
		getline(cin, input); // 한 줄을 다 입력받음
		for (int j = 0; j < 6; j++) {
			if (input.find(command[j]) != string::npos) { // 찾았다면				
				if (j == 0) { // push
					string temp = "";
					for (int k = 5; k < input.length(); k++) {
						temp += input[k]; // 정수 string으로 받은다음
					}
					int in = stoi(temp); // stoi로 정수 만듦
					myqueue.push(in);
				}
				else if (j == 1) { // pop
					myqueue.pop();
				}
				else if (j == 2) { // size
					myqueue.size_();
				}
				else if (j == 3) { // empty
					if (myqueue.empty() == true) {
						cout << 1 << "\n";
					}
					else {
						cout << 0 << "\n";
					}
				}
				else if (j == 4) { // front
					myqueue.front_();
				}
				else { // back
					myqueue.back();
				}
			}
		}
	}

push 문 때문에 getline 함수로 한 줄을 받아주었다.

그래서인지 엔터키를 칠 때 자꾸 N-1만큼만 입력되는 문제가 생겨 for문을 N+1번 반복하였다.

또한 string 헤더파일에 있는 find 함수를 이용하여 command 배열에 있는 명령어와 비교하여 처리했다.

find 함수는 해당 문자열을 찾지 못하면 string::npos를 반환한다.

 

 

전체 코드

#include <iostream>
#include <string>
#define MAX 100000 // queue의 최대 크기는 10,000
using namespace std;

template<class T> class MyQueue
{
public :
	int front; int rear; int size;
	T* values;

	MyQueue() {
		size = MAX;
		values = new T[size];
		front = 0; rear = 0;
	}

	~MyQueue() { delete[] values; }

	void push(T value) {
		values[rear] = value;
		rear++;
	}

	void pop() {
		if (!empty()) {
			cout << values[front] << "\n";
			front++;
		}
		else { // queue에 들어있는 정수가 없는 경우
			cout << -1 << "\n";
		}
	}

	void size_() { // 재정의 오류 발생
		cout << rear - front <<"\n";
	}

	bool empty() {
		if (front == rear) {
			return true;
		}
		else return false;
	}

	void front_() { // 재정의 오류 발생
		if (!empty()) cout << values[front] << "\n";
		else cout << -1 << "\n";
	}

	void back() {
		if (!empty()) cout << values[rear - 1] << "\n";
		else cout << -1 << "\n";
	}
};

int N;
string command[6] = { "push", "pop", "size", "empty", "front", "back" };
string input;

MyQueue<int> myqueue;

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

	cin >> N;
	for (int i = 0; i < N + 1; i++) // getline 함수 때문에 자꾸 N-1만큼 입력을 받음,, 그래서 N만큼 반복하도록
	{
		getline(cin, input); // 한 줄을 다 입력받음
		for (int j = 0; j < 6; j++) {
			if (input.find(command[j]) != string::npos) { // 찾았다면				
				if (j == 0) { // push
					string temp = "";
					for (int k = 5; k < input.length(); k++) {
						temp += input[k]; // 정수 string으로 받은다음
					}
					int in = stoi(temp); // stoi로 정수 만듦
					myqueue.push(in);
				}
				else if (j == 1) { // pop
					myqueue.pop();
				}
				else if (j == 2) { // size
					myqueue.size_();
				}
				else if (j == 3) { // empty
					if (myqueue.empty() == true) {
						cout << 1 << "\n";
					}
					else {
						cout << 0 << "\n";
					}
				}
				else if (j == 4) { // front
					myqueue.front_();
				}
				else { // back
					myqueue.back();
				}
			}
		}
	}
}

 

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

[1158] 요세푸스 문제  (0) 2022.11.06
[10866] 덱  (0) 2022.11.04
[17413] 단어 뒤집기 2  (0) 2022.11.02
[2156] 포도주 시식  (0) 2022.10.31
[2579] 계단 오르기  (0) 2022.10.31

댓글