백준 코드 공부/C언어

백준 10845 : 큐 (C언어)

GUuu9 2021. 11. 27. 13:36

문제 10845번: 큐 (acmicpc.net)

 

10845번: 큐

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

www.acmicpc.net

#include<stdio.h>
#include<string.h>

int queue[10001]={0,};
char command[6];
int queuenum = 0;

void callpush(int value);
void callpop();
void callsize();
void callempty();
void callfront();
void callback();


int main() {
	int task, i, value;
	char *push = "push", *pop = "pop", *size = "size", *empty = "empty", *front = "front", *back = "back";
	scanf("%d", &task);
	
	for(i=0;i<task;i++){
	    
	    scanf("%s", command);

	    if(strcmp(command, push) == 0){
	        scanf("%d", &value);
	        callpush(value);
	    }
	    else if(strcmp(command, pop) == 0){
	        callpop();
	    }
	    else if(strcmp(command, size) == 0){
	        callsize();
	    }
	    else if(strcmp(command, empty) == 0){
	        callempty();
	    }
	    else if(strcmp(command, front) == 0){
	        callfront();
	    }
	    else if(strcmp(command, back) == 0){
	        callback();
	    }
	}
}

void callpush(int value){
    queue[queuenum] = value;
    queuenum++;
}
void callpop(){
    int i;
    if(queue[0] == 0 && queuenum == 0)
        printf("-1\n");
    else{
        printf("%d\n", queue[0]);
        for(i=0;i<queuenum;i++){
            queue[i] = queue[i+1];
        }
        queue[queuenum] = 0;
        queuenum--;
    }
}
void callsize(){
    printf("%d\n", queuenum);
}
void callempty(){
    if(queuenum==0&&queue[queuenum]==0)
        printf("1\n");
    else
        printf("0\n");
}
void callfront(){
    if(queuenum==0&&queue[queuenum]==0)
        printf("-1\n");
    else
        printf("%d\n", queue[0]);
}
void callback(){
    if(queuenum==0&&queue[queuenum]==0)
        printf("-1\n");
    else
        printf("%d\n", queue[queuenum-1]);
}

큐는 원통형의 모형의 저장 입니다.

배열의 0번쪽의 위치를 front라고 부르며 반대편을 back 이라고 합니다. 

선입 선출 First in First out 방식으로 값이 들어오면 back 으로 들어가서 front방향으로 나갑니다.

#include<stdio.h>
#include<string.h>

int queue[10001]={0,};
char command[6];
int queuenum = 0;

void callpush(int value);
void callpop();
void callsize();
void callempty();
void callfront();
void callback();

먼저 필요한 헤더와 전역 변수들을 선언합니다. 또한 값을 처리해줄 함수들을 선언합니다.

int main() {
	int task, i, value;
	char *push = "push", *pop = "pop", *size = "size", *empty = "empty", *front = "front", *back = "back";
	scanf("%d", &task);
	
	for(i=0;i<task;i++){
	    
	    scanf("%s", command);

	    if(strcmp(command, push) == 0){
	        scanf("%d", &value);
	        callpush(value);
	    }
	    else if(strcmp(command, pop) == 0){
	        callpop();
	    }
	    else if(strcmp(command, size) == 0){
	        callsize();
	    }
	    else if(strcmp(command, empty) == 0){
	        callempty();
	    }
	    else if(strcmp(command, front) == 0){
	        callfront();
	    }
	    else if(strcmp(command, back) == 0){
	        callback();
	    }
	}
}

메인 함수를 입니다.

task로 명령 받을 개수를 받습니다. value 의 경우는 push 명령에서 입력하는 숫자도 추가로 넣기 때문에 추가했습니다.

char의 경우 입력된 command와 비교해서 <string.h>에 있는 문자 비교 strcmp를 사용해 동일한 입력이라면 해당 명령을 수행하도록 했습니다. strcmp함수의 경우 두개의 값이 동일한 경우 0을 반환합니다. 

void callpush(int value){
    queue[queuenum] = value;
    queuenum++;
}
void callpop(){
    int i;
    if(queue[0] == 0 && queuenum == 0)
        printf("-1\n");
    else{
        printf("%d\n", queue[0]);
        for(i=0;i<queuenum;i++){
            queue[i] = queue[i+1];
        }
        queue[queuenum] = 0;
        queuenum--;
    }
}
void callsize(){
    printf("%d\n", queuenum);
}
void callempty(){
    if(queuenum==0&&queue[queuenum]==0)
        printf("1\n");
    else
        printf("0\n");
}
void callfront(){
    if(queuenum==0&&queue[queuenum]==0)
        printf("-1\n");
    else
        printf("%d\n", queue[0]);
}
void callback(){
    if(queuenum==0&&queue[queuenum]==0)
        printf("-1\n");
    else
        printf("%d\n", queue[queuenum-1]);
}

callpush 는 먼저 현재 위치에 value 값을 받아서 넣습니다. 이후 queuenum 값을 증가 시켜줍니다.

callpop은 배열의 맨앞 front에 위치한 0번 위치의 값을 출력하고 제거합니다. 만약 0번의 값이 0이라면 비어 있는  큐 이므로 -1을 출력합니다. 만약 값이 존재해서 출력되었다면 뒤의 배열을을 모두 앞으로 한칸씩 옮겨옵니다. 이후에 queuenum을 하나 감소시킵니다.

callsize 는 현재 배열의 크기를 확인합니다. 크기는 1부터 시작하고 배열은 0번부터 시작하므로 queuenum의 번호가 현재 배열의 크기가 됩니다.

callempty 는 배열이 비어있는지 아닌지를 확인하여 값을 출력 합니다. 0번 배열의 값만 확인 해보고 값이 0이라면 1 아니라면 0을 출력 합니다.

callfront는 큐의 맨 앞의 값을 출력하고 callback은 큐의 맨 끝값을 출력합니다


스택(stack) 2021.11.27 - [백준 코드 공부/C언어] - 백준 10828 : 스택 (C언어)

 

백준 10828 : 스택 (C언어)

문제 10828번: 스택 (acmicpc.net) #include #include int stack[10001]={0,}; char command[6]; int stacknum = 0; void callpush(int value){ stack[stacknum] = value; stacknum++; } void callpop(){ if(stac..

531522szerodesire.tistory.com

덱(deque) 2021.11.27 - [백준 코드 공부/C언어] - 백준 10866 : 덱 (C언어)

 

백준 10866 : 덱 (C언어)

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

531522szerodesire.tistory.com


Git Hub

BaekJoon-Study/10845:큐.c at C · GUuu9/BaekJoon-Study (github.com)

 

GitHub - GUuu9/BaekJoon-Study

Contribute to GUuu9/BaekJoon-Study development by creating an account on GitHub.

github.com