백준 코드 공부/C언어

백준 10866 : 덱 (C언어)

GUuu9 2021. 11. 27. 13:53

문제 10866번: 덱 (acmicpc.net)

 

10866번: 덱

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

www.acmicpc.net


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

int deque[10001]={0,};
char command[15];
int dequenum = 0;

void callpush_front(int value);
void callpush_back(int value);
void callpop_front();
void callpop_back();
void callsize();
void callempty();
void callfront();
void callback();


int main() {
	int task, i, value;
	char *pushf = "push_front", *pushb = "push_back", *popf = "pop_front", *popb = "pop_back";
	char *size = "size", *empty = "empty", *front = "front", *back = "back";
	scanf("%d", &task);
	
	for(i=0;i<task;i++){
	    
	    scanf("%s", command);

	    if(strcmp(command, pushf) == 0){
	        scanf("%d", &value);
	        callpush_front(value);
	    }
	    if(strcmp(command, pushb) == 0){
	        scanf("%d", &value);
	        callpush_back(value);
	    }
	    else if(strcmp(command, popf) == 0){
	        callpop_front();
	    }
	    else if(strcmp(command, popb) == 0){
	        callpop_back();
	    }
	    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_front(int value){
    for(int i=dequenum;i>=0;i--){
        deque[i+1] = deque[i];
    }
    deque[0] = value;
    dequenum++;
}
void callpush_back(int value){
    deque[dequenum] = value;
    dequenum++;
}
void callpop_front(){
    if(deque[0] == 0 && dequenum == 0)
        printf("-1\n");
    else{
        printf("%d\n", deque[0]);
        for(int i=0;i<dequenum;i++){
            deque[i] = deque[i+1];
        }
        deque[dequenum] = 0;
        dequenum--;
    }
}
void callpop_back(){
    if(deque[0] == 0 && dequenum == 0)
        printf("-1\n");
    else{
        printf("%d\n", deque[dequenum-1]);
        deque[dequenum-1] = 0;
        dequenum--;
    }
}
void callsize(){
    printf("%d\n", dequenum);
}
void callempty(){
    if(dequenum==0&&deque[dequenum]==0)
        printf("1\n");
    else
        printf("0\n");
}
void callfront(){
    if(dequenum==0&&deque[dequenum]==0)
        printf("-1\n");
    else
        printf("%d\n", deque[0]);
}
void callback(){
    if(dequenum==0&&deque[dequenum]==0)
        printf("-1\n");
    else
        printf("%d\n", deque[dequenum-1]);
}

덱의 구조는 큐의 구조에서 front와 back의 구분이 사라져 어느쪽으로도 데이터를 넣을 수 있고 뺄 수 있습니다.

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

int deque[10001]={0,};
char command[15];
int dequenum = 0;

void callpush_front(int value);
void callpush_back(int value);
void callpop_front();
void callpop_back();
void callsize();
void callempty();
void callfront();
void callback();

사용할 덱과 함수를 선언합니다. 명령어의 길이가 길어졌기 때문에 길이를 늘렸습니다.

int main() {
	int task, i, value;
	char *pushf = "push_front", *pushb = "push_back", *popf = "pop_front", *popb = "pop_back";
	char *size = "size", *empty = "empty", *front = "front", *back = "back";
	scanf("%d", &task);
	
	for(i=0;i<task;i++){
	    
	    scanf("%s", command);

	    if(strcmp(command, pushf) == 0){
	        scanf("%d", &value);
	        callpush_front(value);
	    }
	    if(strcmp(command, pushb) == 0){
	        scanf("%d", &value);
	        callpush_back(value);
	    }
	    else if(strcmp(command, popf) == 0){
	        callpop_front();
	    }
	    else if(strcmp(command, popb) == 0){
	        callpop_back();
	    }
	    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_front(int value){
    for(int i=dequenum;i>=0;i--){
        deque[i+1] = deque[i];
    }
    deque[0] = value;
    dequenum++;
}
void callpush_back(int value){
    deque[dequenum] = value;
    dequenum++;
}
void callpop_front(){
    if(deque[0] == 0 && dequenum == 0)
        printf("-1\n");
    else{
        printf("%d\n", deque[0]);
        for(int i=0;i<dequenum;i++){
            deque[i] = deque[i+1];
        }
        deque[dequenum] = 0;
        dequenum--;
    }
}
void callpop_back(){
    if(deque[0] == 0 && dequenum == 0)
        printf("-1\n");
    else{
        printf("%d\n", deque[dequenum-1]);
        deque[dequenum-1] = 0;
        dequenum--;
    }
}
void callsize(){
    printf("%d\n", dequenum);
}
void callempty(){
    if(dequenum==0&&deque[dequenum]==0)
        printf("1\n");
    else
        printf("0\n");
}
void callfront(){
    if(dequenum==0&&deque[dequenum]==0)
        printf("-1\n");
    else
        printf("%d\n", deque[0]);
}
void callback(){
    if(dequenum==0&&deque[dequenum]==0)
        printf("-1\n");
    else
        printf("%d\n", deque[dequenum-1]);
}

callpush_front 는 데이터를 받아서 덱의 맨 앞에 넣어줍니다. 배열의 0번에 들어가므로 기존에 데이터가 이미 들어가 있다면 모든 데이터를 뒤로 한칸씩 옮긴 후 0번 위치데 value 값을 넣습니다. 덱의 크기가 1만큼 증가 했으므로 dequenum도 증가 시켜둡니다

callpush_back은 배열의 마지막 위치에 value 값을 저장하므로 별다른 작업없이 dequenum값에 맞추어 넣고 값을 증가 시킵니다.

callpop_front 은 덱의 0번 값을 출력하고 제거합니다. 0번의 배열이 없어지므로 덱의 모든 데이터를 앞으로 한칸씩 옮겨주고 dequenum을 줄여줍니다.

callpop_back의 경우 덱의 마지막 값을 출력하고 제거합니다. 덱의 이동은 따로 필요로 하지 않고 dequenum만 감소시켜 줍니다.

나머지 함수는 기존 스택과 큐와 큰 차이가 존재 하지 않으므로 생략하겠습니다.


스택 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

2021.11.27 - [백준 코드 공부/C언어] - 백준 10845 : 큐 (C언어)

 

백준 10845 : 큐 (C언어)

문제 10845번: 큐 (acmicpc.net) #include #include int queue[10001]={0,}; char command[6]; int queuenum = 0; void callpush(int value); void callpop(); void callsize(); void callempty(); void callfron..

531522szerodesire.tistory.com


Git Hub

BaekJoon-Study/10866:덱.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