[백준] 2164번 카드2 (= card2) - 재우스 프로그래밍 (C 언어)

2021. 2. 4. 18:25백준

문제 링크 :www.acmicpc.net/problem/2164

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define DEBUG 1
#define MAX_QUEUE_SIZE 999999
//최대 카드 500000 + 최대 카드에서 push 횟수 499998 + 큐에서 full과 empty를 구분하기 위한 공간 + 1

typedef struct _queue {
    int mem[MAX_QUEUE_SIZE];
    int Front;
    int Back;
} queue;

bool empty(queue *);
void pop(queue *);
void push(queue *, int);
size_t size(queue *);
int front(queue *);
int back(queue *);
void initQueue(queue *);

int main(void)
{
    int N = 0;    //카드의 장수
    int temp = 0;
    queue *qu = (queue *)malloc(sizeof(queue));
    initQueue(qu);

    scanf("%d", &N);
    for (int i = 1; i <= N; i++) {
        push(qu, i);
    }

    while ((int)size(qu) > 1) {
        pop(qu);
        if ((int)size(qu) > 1) {
            temp = front(qu);
            pop(qu);
            push(qu, temp);
        }
        else {
            break;
        }
    }

    printf("%d\n", back(qu));

    free(qu);
    return 0;
}

bool empty(queue *qu)
{
    if (qu->Front == qu->Back) { return true; }
    else { return false; }
}
void pop(queue *qu)
{
    qu->Front++;
    qu->mem[qu->Front] = 0;
    return;
}
void push(queue *qu, int data)
{
    qu->Back++;
    qu->mem[qu->Back] = data;
    return;
}
size_t size(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]; }
void initQueue(queue *qu)
{
    for (int i = 0; i < MAX_QUEUE_SIZE; i++) {
        qu->mem[i] = 0;
    }
    qu->Front = -1;
    qu->Back = -1;
    return;
}