ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BOJ #10845 큐
    BOJ 2021. 1. 18. 21:03

    문제

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

    명령은 총 여섯 가지이다.

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

    입력

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

    출력

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

     


    소스코드(C언어)

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <string.h>
    
    typedef struct {
    	int value;
    	struct NODE* next;
    }NODE;
    
    typedef struct {
    	int size;
    	struct NODE* first;
    	struct NODE* last;
    }QUEUE;
    
    void push(QUEUE* queue, int num);
    int pop(QUEUE* queue);
    int size(QUEUE* queue);
    int empty(QUEUE* queue);
    int front(QUEUE* queue);
    int back(QUEUE* queue);
    
    int main() {
    	int N;
    	scanf("%d", &N);
    
    	QUEUE* queue;
    	queue = (QUEUE*)malloc(sizeof(QUEUE));
    	queue->size = 0;
    	queue->first = NULL;
    	queue->last = NULL;
    
    	char str[10];
    	int num;
    
    	for (int i = 0; i < N; i++) {
    		scanf("%s", str);
    		if (!strcmp(str, "push")) {
    			scanf("%d", &num);
    			push(queue, num);
    		}
    		else if (!strcmp(str, "pop"))
    			printf("%d\n", pop(queue));
    		else if (!strcmp(str, "size"))
    			printf("%d\n", size(queue));
    		else if (!strcmp(str, "empty"))
    			printf("%d\n", empty(queue));
    		else if(!strcmp(str, "front"))
    			printf("%d\n", front(queue));
    		else
    			printf("%d\n", back(queue));
    	}
    
    	for (int i = 0; i < queue->size; i++) {
    		pop(queue);
    	}
    
    	free(queue);
    
    	return 0;
    }
    
    void push(QUEUE* queue, int num) {
    	NODE *node, *tmp;
    	node = (NODE*)malloc(sizeof(NODE));
    	node->value = num;
    	tmp = queue->last;
    
    	if (queue->size == 0)
    		queue->first = node;
    	else
    		tmp->next = node;
    
    	queue->size++;
    	queue->last = node;
    }
    
    int pop(QUEUE* queue) {
    	NODE* tmp = queue->first;
    
    	if (queue->size == 0)
    		return -1;
    
    	int num = tmp->value;
    	queue->first = tmp->next;
    	queue->size--;
    	free(tmp);
    
    	return num;
    }
    
    int size(QUEUE* queue) {
    	return queue->size;
    }
    
    int empty(QUEUE* queue) { //비어있으면 1, 아니면 0 출력
    	if (queue->size == 0)
    		return 1;
    	else
    		return 0;
    }
    
    int front(QUEUE* queue) {
    	NODE* tmp = queue->first;
    
    	if (queue->size == 0)
    		return -1;
    
    	int num = tmp->value;
    	return num;
    }
    
    int back(QUEUE* queue) {
    	NODE* tmp = queue->last;
    
    	if (queue->size == 0)
    		return -1;
    
    	int num = tmp->value;
    	return num;
    }

     

    Idea

    큐는 First In First Out이다.

    'BOJ' 카테고리의 다른 글

    BOJ #1725 히스토그램  (0) 2021.01.19
    BOJ #2164 카드2  (0) 2021.01.18
    BOJ #16120 PPAP  (0) 2021.01.18
    BOJ #10799 쇠막대기  (0) 2021.01.17
    BOJ #1935 후위 표기식2  (0) 2021.01.17

    댓글

Designed by Tistory.