티스토리 뷰

728x90
반응형

백준 온라인 저지(BOJ) 10845번 큐
https://www.acmicpc.net/problem/10845

 

10845번: 큐

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

www.acmicpc.net

* 사용언어 : C언어, C++

 

1. 문제

정수를 저장하는 큐를 구현하고, 아래 6가지 명령을 처리하는 프로그램 작성

 

2. 풀이

FIFO(First In First Out)의 성질을 가지는 큐를 구현하는 문제입니다.
다양한 방식으로 구현할 수 있을텐데, 저는 Library 없이 배열로 구현해보았습니다.
 
명령의 수가 최대 10,000이기 때문에 배열은 10,000개 크기이면 충분합니다.
(push 만 10,000번 했을 때 최대 크기)
 
push 는 배열의 0번 자리부터 순차적으로 채우도록 설계했으므로
push 는 현재 배열의 가장 큰 자리에, pop 은 가장 작은 자리에서 하면 됩니다.
 
이를 f(front) 와 b(back)라는 변수를 두고 pointer 처럼 활용했습니다.
그 외 풀이는 아래 코드 참고하시면 될 것 같습니다.

 

3. 코드

#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif
/*
10845_큐
1156kb	4ms
*/
#include <cstdio>

int q[10000], f, b;

int my_strcmp(const char *a, const char *b) {
	while (*a && *a++ == *b++);
	return *a - *b;
}

int main() {
#ifdef _WIN32
	freopen("input.txt", "r", stdin);
#endif // _WIN32
	int n;
	scanf("%d", &n);

	char op[6];
	int x, res;
	while (n--) {
		scanf("%s", op);
		if (!my_strcmp(op, "push")) {
			scanf("%d", &x);
			q[b++] = x;
		}
		else {
			if (!my_strcmp(op, "pop")) {
				if (f < b) res = q[f++];
				else res = -1;
			}
			else if (!my_strcmp(op, "size")) {
				res = b - f;
			}
			else if (!my_strcmp(op, "empty")) {
				res = (f == b);
			}
			else if (!my_strcmp(op, "front")) {
				if (f < b) res = q[f];
				else res = -1;
			}
			else if (!my_strcmp(op, "back")) {
				if (f < b) res = q[b - 1];
				else res = -1;
			}
			printf("%d\n", res);
		}
	}
	return 0;
}

* q 의 b 위치에는 숫자가 없으므로 "back" 명령 처리 시 -1 위치의 숫자를 출력합니다.

728x90
반응형
댓글