거북이의 IT 공부

[백준 10845] 큐 - C/C++ 본문

Baekjoon

[백준 10845] 큐 - C/C++

버니빈 2020. 4. 9. 15:54

문제

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

 

10845번: 큐

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

www.acmicpc.net

 

나의 코드 - C언어

#define _CRT_SECURE_NO_WARNINGS
#define MAX_QUEUE_SIZE 10000
#define Success 1
#define Error -1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct {
	int queue[MAX_QUEUE_SIZE];
	int head;
	int tail;
}QueueType;

QueueType* created() {
	QueueType* q;

	q = (QueueType*)malloc(sizeof(QueueType));
	q->head = 0;
	q->tail = 0;

	return q;
}

int is_empty(QueueType* q) {
	return (q->head == q->tail);
}

int is_full(QueueType* q) {
	return ((q->tail + 1) % MAX_QUEUE_SIZE == q->head);
}

int enqueue(QueueType* q, int item) {
	if (is_full(q))
		return Error;

	q->tail = (q->tail + 1) % MAX_QUEUE_SIZE;
	q->queue[q->tail] = item;
	return Success;
}

int dequeue(QueueType* q) {
	if (is_empty(q))
		return Error;

	q->head = (q->head + 1) % MAX_QUEUE_SIZE;
	return q->queue[q->head];
}

int main() {
	char com[10];
	int num, item;
	QueueType* q = created();

	scanf("%d", &num);

	for (int i = 0; i < num; i++) {
		scanf("%s", com);
		fgetc(stdin);

		if (!strcmp(com, "push")) {
			scanf("%d", &item);
			fgetc(stdin);

			enqueue(q, item);
		}
		else if (!strcmp(com, "pop")) {
			printf("%d\n", dequeue(q));
		}
		else if (!strcmp(com, "size")) {
			printf("%d\n", q->tail - q->head);
		}
		else if (!strcmp(com, "empty")) {
			printf("%d\n", is_empty(q));
		}
		else if (!strcmp(com, "front")) {
			if (is_empty(q))
				printf("%d\n", -1);
			else
				printf("%d\n", q->queue[q->head + 1]);
		}
		else if (!strcmp(com, "back")) {
			if (is_empty(q))
				printf("%d\n", -1);
			else
				printf("%d\n", q->queue[q->tail]);
		}
	}

	return 0;
}

 

참고로 아래의 코드는 오류가 난다.

왜냐하면 vector 사이즈를 늘려놓지 않고 무작정 값을 넣기 떄문!! 그래서 push_back를 사용한다.

vector<int> vec(5);처럼 크기를 정해놓지 않는 이상 push_back를 사용해야 한다.

 

나의코드 - C++

STL queue를 사용하여 쉽게 문제해결이 가능하다.

 

#include <iostream>
#include <string>
#include <queue>

using namespace std;

int main() {
	queue <int> q;
	int num;

	cin >> num;

	for (int i = 0; i < num; i++) {
		string com;
		cin >> com;

		if (com == "push") {
			int com_end;
			cin >> com_end;

			q.push(com_end);
		}
		else if (com == "pop") {
			if (q.empty())
				cout << "-1" << '\n';
			else {
				cout << q.front() << '\n';
				q.pop();
			}
		}
		else if (com == "size") {
			cout << q.size() << '\n';
		}
		else if (com == "empty") {
			if (q.empty())
				cout << "1" << '\n';
			else
				cout << "0" << '\n';
		}
		else if (com == "front") {
			if(q.empty())
				cout << "-1" << '\n';
			else
				cout << q.front() << '\n';
		}
		else if (com == "back") {
			if (q.empty())
				cout << "-1" << '\n';
			else
				cout << q.back() << '\n';
		}
	}
}

 

 

 

 

Comments