๋ฌธ์ œ

https://www.acmicpc.net/problem/10845

์„ค๋ช…

ํ(Queue)?

์ด ๋ฌธ์ œ๋„ ์ €๋ฒˆ๋ฌธ์ œ ์Šคํƒ๊ณผ ๊ฐ™์ด ์ž๋ฃŒ๊ตฌ์กฐ์˜ ํ˜•ํƒœ์ค‘ ํ•˜๋‚˜์ธ ํ๋ฅผ ์†Œ์Šค๋กœ ํ‘œํ˜„ํ•˜๋ผ๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜๊ฒ ๋‹ค.

ํ(Queue)๋Š” ์‚ฌ์ง„์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์š”-๋Ÿฐ? ๋Š๋‚Œ

Source : GIPHY

์œ„ ์›€์งค ์ฒ˜๋Ÿผ ์šฐ๋ฆฌ๊ฐ€ ์ค„์„ ์„œ๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•˜๋ฉด ๋œ๋‹ค.

์ค„์€ ๋’ค์—์„œ ์‚ฌ๋žŒ์ด ์œ ์ž…๋˜๊ณ  ์•ž์—์„œ ๋ถ€ํ„ฐ ์‚ฌ๋žŒ์ด ๋น ์ง€๊ฒŒ ๋˜๋Š”๋ฐ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ํ˜•ํƒœ์ธ ํ ๋˜ํ•œ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค.

ํ์—์„œ๋Š” ์ œ์ผ ๋‚˜์ค‘์— ๋“ค์–ด์˜จ ์ž๋ฃŒ๊ฐ€ ๋จผ์ € ๋‚˜๊ฐˆ ์ˆ˜ ์—†๋‹ค. (์Šคํƒ ์—์„œ ๊ฐ€๋Šฅํ•˜๋‹ค)

Source : GIPHY

์ด๋ ‡๊ฒŒ ๋จผ์ € ๋“ค์–ด์˜จ ์ž๋ฃŒ๊ฐ€ ๋จผ์ € ๋‚˜๊ฐ€๋Š” ์ด๋Ÿฌํ•œ ํŠน์ง•์„ ๋ณด๊ณ  FIFO(First In First Out)์ด๋ผ ํ•˜๋ฉฐ, ์ด๋Ÿฌํ•œ ์ž๋ฃŒ ํ˜•ํƒœ๋Š” ์ด๋ ‡๊ฒŒ ์ค„ ์„œ๋Š” ๊ฒƒ ๋ง๊ณ ๋„ ์ปดํ“จํ„ฐ์—์„œ๋„ ๋งŽ์ด ์ ‘ํ•ด๋ณผ ์ˆ˜ ์žˆ์—ˆ์„ํ…๋ฐ ๋Œ€ํ‘œ์ ์œผ๋กœ ํ”„๋ฆฐํ„ฐ์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ธ์‡„ํ• ๋•Œ๋‹ค.

Source : GIPHY

์šฐ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฌธ์„œ๋ฅผ ์ธ์‡„ ํ• ๋•Œ ์—ฌ๋Ÿฌ๋ฌธ์„œ๋ฅผ ๋ชจ๋‘ ์ปดํ“จํ„ฐ์—์„œ ์—ด๊ณ  ์ „๋ถ€ ์ธ์‡„๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋‹น์—ฐํ•œ ์†Œ๋ฆฌ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ์ธ์‡„๊ธฐ๋Š” ํ•œ๋ฒˆ์— ํ•œ์žฅ์˜ ๋ฌธ์„œ๋ฐ–์— ์ธ์‡„ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋จผ์ € ์š”์ฒญ์ด ๋“ค์–ด์˜จ ๋ฌธ์„œ์˜ ์ธ์‡„๋ฅผ ์‹œ์ž‘ํ•จ๊ณผ ๋™์‹œ์— ๋‹ค๋ฅธ ๋ฌธ์„œ๋Š” ๋Œ€๊ธฐ์—ด์— ์˜ฌ๋ฆฌ๊ณ  ํ˜„์žฌ ์ธ์‡„ ์ค‘์ธ ๋ฌธ์„œ๊ฐ€ ๋ชจ๋‘ ์ธ์‡„๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋Œ€๊ธฐ์—ด์— ์žˆ๋Š” ๋ฌธ์„œ์ค‘ ์ œ์ผ ๋จผ์ € ๋Œ€๊ธฐ์—ด์— ์˜ฌ๋ผ์˜จ ๋ฌธ์„œ๋ถ€ํ„ฐ ์ธ์‡„๋ฅผ ๊ณ„์† ์ง„ํ–‰ํ•˜๊ณ  ๋Œ€๊ธฐ์—ด์— ๋ฌธ์„œ๊ฐ€ ๋ชจ๋‘ ์—†์–ด์งˆ๋•Œ๊นŒ์ง€ ๊ณ„์† ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

โ€ป ๋Œ€๊ธฐ์—ด์€ Queue(ํ)์˜ ๋ฒˆ์—ญ์–ด ์ด๊ธฐ๋„ ํ•˜๋‹ค.

ํ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์ด์ •๋„๋กœ ํ•˜๊ธฐ๋กœ ํ•˜๊ณ  ํ•œ๋ฒˆ ๋ฌธ์ œ๋ฅผ ์‚ดํŽด ๋ณด๋„๋ก ํ•˜์ž.

๋ฌธ์ œ ํ’€์ด

์ด๋ฌธ์ œ๋Š” ์ „์— ํ’€์—ˆ๋˜ ์Šคํƒ์—์„œ ์ผ๋˜ ์†Œ์Šค๋ฅผ ์กฐ๊ธˆ ๊ณ ์น˜๋Š” ๊ฒƒ ๋งŒ์œผ๋กœ๋„ ํ‘ธ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ Push, Size, Empty ํ•จ์ˆ˜๋Š” ๊ทธ๋Œ€๋กœ ์žฌํƒ•ํ•˜๋Š”๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค!

Source : GIPHY

์˜คโ€”์˜ˆ-

์ด๊ฒƒ์€ ์Šคํƒ๊ณผ ํ์— ์ž๋ฃŒ๋ฅผ ์‚ฝ์ž…ํ• ๋•Œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋™์ผํ•˜๊ธฐ ๋–„๋ฌธ์— ๊ทธ๋Ÿฐ ๊ฒƒ์ด๊ณ , ๋ฐ˜๋Œ€๋กœ ์ž๋ฃŒ๋ฅผ ๋นผ๋‚ด๋Š” ๋ช…๋ น์–ด์ธ Pop์— ๊ฒฝ์šฐ ํ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ์œ„ํ•ด์„œ ๋ณ„๋„๋กœ ๋‹ค์‹œ ์ฝ”๋”ฉ์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์Šคํƒ๊ณผ ๋‹ฌ๋ฆฌ ํ์—์„œ ์ˆ˜์ •๋œ ์†Œ์Šค๋งŒ ์ง‘์ค‘์ ์œผ๋กœ ์„ค๋ช…ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

์Šคํƒ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์—ฌ๊ธฐ : https://hoshi2710.github.io/๋ฐฑ์ค€/10828.html

...
int size_cnt = 0;
void pop(void)
{
    if (size_cnt == 0)
        printf("-1\n");
    else
    {
        printf("%d\n", stack[size_cnt - 1]);
        stack[size_cnt - 1] = 0;
        size_cnt--;
    }
}
int main()
{
	...
}

Pop ๋ช…๋ น์— ๊ฒฝ์šฐ ์›๋ž˜ ์Šคํƒ์—์„œ๋Š” ๋‚˜์ค‘์— ๋“ค์–ด์˜จ ์ž๋ฃŒ๋ฅผ ๋จผ์ € ๋บด๋‚ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— stack[0]์˜ ์ž๋ฃŒ๋ฅผ ๋นผ๋‚ด๊ณ  ๋‚˜๋จธ์ง€ ์ž๋ฃŒ๋ฅผ ๋นˆ์นธ์„ ๋งค์šฐ๊ธฐ ์œ„ํ•ด ๋‹น๊ธฐ๋Š” ์ž‘์—…์ด ํ•„์š”ํ–ˆ์œผ๋‚˜ ํ๋Š” ๋จผ์ € ๋“ค์–ด์˜จ ์ž๋ฃŒ๊ฐ€ ๋จผ์ € ๋‚˜๊ฐ€๋Š” ๊ตฌ์กฐ ์ด๋ฏ€๋กœ stack[size_cnt-1]์˜ ์ž๋ฃŒ๋ฅผ ๋นผ์ฃผ๋ฉด ๋˜๋ฉฐ, ๋”ฐ๋กœ ์Šคํƒ์—์„œ ์ฒ˜๋Ÿผ ๋‹น๊ธฐ๋Š” ์ž‘์—… ์—†์ด size_cnt์˜ ๊ฐ’์„ 1 ๋นผ์ฃผ๋Š” ์ž‘์—…๋งŒ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

(stack์—์„œ ์“ด ์†Œ์Šค๋ฅผ ๊ทธ๋Œ€๋กœ ์ˆ˜์ •ํ•œ๊ฑฐ ์—ฌ์„œ ๋ฐฐ์—ด ์ด๋ฆ„์ด stack์œผ๋กœ ๋˜์–ด ์žˆ๋‹ค. ์‹ค์ œ ๋ฌธ์ œ๋„ stack์ด๋ผ๋Š” ๋ฐฐ์—ด ๋ช…์œผ๋กœ ์ œ์ถœํ•˜์˜€์œผ๋‚˜ ์ด ๋ฐ‘์—์„œ ๋ถ€ํ„ฐ๋Š” stack์ด ์•„๋‹Œ queue๋ผ๊ณ  ๋ฐฐ์—ด ์ด๋ฆ„์„ ๋ฐ”๊พผ ์ƒํƒœ๋กœ ์„ค๋ช…์„ ์ด์–ด ๊ฐ€๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.)

๋‹ค์Œ Front, Back ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด ์ค˜์•ผํ•˜๋Š”๋ฐ ๋‘ ํ•จ์ˆ˜๋Š” ๋ฐฐ์—ด์„ ์ˆ˜์ •ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ทธ๋ƒฅ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜ ์ด๋ฏ€๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด๋งŒ ๊ตฌํ˜„ํ•ด ์ฃผ๋ฉด ๋์ด๋‹ค.

...
void front(void)
{
    if (size_cnt == 0)
        printf("-1\n");
    else
        printf("%d\n", queue[size_cnt-1]);
}
void back(void)
{
    if (size_cnt == 0)
        printf("-1\n");
    else
        printf("%d\n", queue[0]);
}
int main()
{
	...
}

stack์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ Top ํ•จ์ˆ˜๋ฅผ ์‘์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

๊ทธ ์ด์™ธ์—๋Š” queue์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ํ•ด์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก mainํ•จ์ˆ˜์—์„œ ์ถ”๊ฐ€์ ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ์ ์–ด์ฃผ์—ˆ๋‹ค.

...
int main()
{
	...
else if (strcmp(command, "front") == 0)
     front();
else if (strcmp(command, "back") == 0)
     back();
	...
}

stack์—์„œ ์ด์šฉํ–ˆ๋˜ Top ๋ช…๋ น์–ด๋ฅผ ์ฝ๋Š” ์†Œ์Šค๋ฅผ ์ง€์šฐ๊ณ  ๊ทธ ๋Œ€์‹  Front, Back ๋ช…๋ น์–ด๋ฅผ ์ฝ์–ด ๋“ค์ผ ์ˆ˜ ์žˆ๋„๋ก ์†Œ์Šค๋ฅผ ์œ„์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•ด ์ฃผ์—ˆ๋‹ค.

์ด๋ ‡๊ฒŒ Queue๋ฅผ ์œ„ํ•œ ์†Œ์Šค๊ฐ€ ์™„์„ฑ๋˜์—ˆ์œผ๋ฉฐ ํ’€์†Œ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int queue[10000], size_cnt = 0;
void push_internal(void)
{
    for (int i = size_cnt; i > 0; i--)
        queue[i] = queue[i - 1];
}
void push(int input)
{
    if (size_cnt != 0)
        push_internal();
    queue[0] = input;
    size_cnt++;
}
void pop(void)
{
    if (size_cnt == 0)
        printf("-1\n");
    else
    {
        printf("%d\n", queue[size_cnt - 1]);
        queue[size_cnt - 1] = 0;
        size_cnt--;
    }
}
void size(void)
{
    printf("%d\n", size_cnt);
}
void empty(void)
{
    int tmp = size_cnt == 0 ? 1 : 0;
    printf("%d\n", tmp);
}

void front(void)
{
    if (size_cnt == 0)
        printf("-1\n");
    else
        printf("%d\n", queue[size_cnt-1]);
}
void back(void)
{
    if (size_cnt == 0)
        printf("-1\n");
    else
        printf("%d\n", queue[0]);
}
int main() {
    int n, command_push;
    char command[10];
    scanf("%d", &n); //๋ช…๋ น ๊ฐฏ์ˆ˜ ์ž…๋ ฅ
    for (int i = 0; i < n; i++)
    {
        scanf("%s", command);
        if (strcmp(command, "push") == 0)
        {
            scanf("%d", &command_push);
            push(command_push);
        }
        else if (strcmp(command, "pop") == 0)
            pop();
        else if (strcmp(command, "size") == 0)
            size();
        else if (strcmp(command, "empty") == 0)
            empty();
        else if (strcmp(command, "front") == 0)
            front();
        else if (strcmp(command, "back") == 0)
            back();
    }

    return 0;
}

๊ฒฐ๊ณผ ๋งํฌ : http://boj.kr/d412c6a7753b456abdd4b932c2028cf9