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
'백준 코드 공부 > C언어' 카테고리의 다른 글
백준 1076 : 저항 (C언어) (0) | 2021.12.04 |
---|---|
백준 1453 : 피시방 알바 (C언어) (0) | 2021.12.04 |
백준 10845 : 큐 (C언어) (0) | 2021.11.27 |
백준 10828 : 스택 (C언어) (0) | 2021.11.27 |
백준 10818 : 최소, 최대 (C언어) (0) | 2021.11.20 |