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 |
댓글