[백준] 12789번 도키도키 간식드리미 (= dokidoki snack helper) - 재우스 프로그래밍 (C 언어)
2021. 2. 21. 11:44ㆍ백준
문제 링크 :www.acmicpc.net/problem/12789
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define DEBUG 1
#define MAX_CONTAINER_SIZE 1001
typedef struct _stack {
int mem[MAX_CONTAINER_SIZE];
int top;
} stack;
typedef struct _queue {
int mem[MAX_CONTAINER_SIZE];
int front;
int back;
} queue;
void sortingLine(int, bool *, stack *, queue *);
void initStack(stack *);
bool emptySt(stack *);
void popSt(stack *);
void pushSt(stack *, int);
size_t sizeSt(stack *);
int top(stack *);
void initQueue(queue *);
bool emptyQu(queue *);
void popQu(queue *);
void pushQu(queue *, int);
size_t sizeQu(queue *);
int front(queue *);
int back(queue *);
int main(void)
{
int N = 0; //간식을 받는 학생들의 수
int input = 0;
bool result = true;
stack *st = (stack *)malloc(sizeof(stack));
queue *qu = (queue *)malloc(sizeof(queue));
initStack(st);
initQueue(qu);
scanf("%d", &N);
for (int i = 0; i < N; i++) {
scanf("%d", &input);
pushQu(qu, input);
}
sortingLine(N, &result, st, qu);
if (result)
printf("Nice\n");
else
printf("Sad\n");
free(st);
free(qu);
return 0;
}
void sortingLine(int N, bool *result, stack *st, queue *qu)
{
//간식번호 1부터 N까지의 번호표
for (int i = 1; i <= N; i++) {
//대기열 왼쪽의 공간의 제일 앞에 있는 사람이 간식 받을 차례의 번호표라면 간식을 받고 다음 간식 번호로 넘어간다
if (!emptySt(st)) {
if (top(st) == i) {
popSt(st);
continue;
}
}
int j;
int size = sizeQu(qu);
for (j = 0; j < size; j++) {
//대기열의 제일 앞에 있는 사람이 간식 받을 차례의 번호표일 때
if (front(qu) == i) {
popQu(qu);
break;
}
//대기열의 제일 앞사람을 대기열 옆 라인으로 보내고 대기열의 다음 사람 번호표 검사ㄷ
else {
pushSt(st, front(qu));
popQu(qu);
}
}
//대기열의 끝까지 검사했는데 현재 순서의 번호표가 없다면 더 이상 진행 불가
if (j == size) {
*result = false;
break;
}
}
return;
}
void initStack(stack *st)
{
for (int i = 0; i < MAX_CONTAINER_SIZE; i++)
st->mem[i] = 0;
st->top = -1;
return;
}
bool emptySt(stack *st)
{
if (st->top == -1) { return true; }
else { return false; }
}
void popSt(stack *st)
{
if (!emptySt(st))
st->mem[st->top--] = 0;
return;
}
void pushSt(stack *st, int data)
{
st->mem[++st->top] = data;
return;
}
size_t sizeSt(stack *st) { return (size_t)(st->top + 1); }
int top(stack *st) { return st->mem[st->top]; }
void initQueue(queue *qu)
{
for (int i = 0; i < MAX_CONTAINER_SIZE; i++)
qu->mem[i] = 0;
qu->front = -1;
qu->back = -1;
return;
}
bool emptyQu(queue *qu)
{
if (!(qu->back - qu->front)) { return true; }
else { return false; }
}
void popQu(queue *qu)
{
if (!emptyQu(qu))
qu->mem[++qu->front] = 0;
return;
}
void pushQu(queue *qu, int data)
{
qu->mem[++qu->back] = data;
return;
}
size_t sizeQu(queue *qu) { return (size_t)(qu->back - qu->front); }
int front(queue *qu) { return qu->mem[qu->front + 1]; }
int back(queue *qu) { return qu->mem[qu->back]; }
'백준' 카테고리의 다른 글
[백준] 11279번 최대 힙 (= maximum heap) - 재우스 프로그래밍 (C 언어) (0) | 2021.02.22 |
---|---|
[백준] 1927번 최소 힙 (= minimal heap) - 재우스 프로그래밍 (C 언어) (0) | 2021.02.22 |
[백준] 18258번 큐2 (= queue2) - 재우스 프로그래밍 (C 언어) (0) | 2021.02.20 |
[백준] 1937번 욕심쟁이 판다 (= greedy panda) - 재우스 프로그래밍 (C 언어) (0) | 2021.02.20 |
[백준] 11403번 경로 찾기 (= path search) - 재우스 프로그래밍 (C 언어) (0) | 2021.02.19 |