๋ฌธ์ œ

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

์„ค๋ช…

์ด ๋ฌธ์ œ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์˜ ์ข…๋ฅ˜ ์ค‘ ์Šคํƒ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ธฐ์— ์ข‹์€ ๋ฌธ์ œ ์ด๋ฉฐ ๊ฐœ์ธ์ ์œผ๋กœ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ์Šคํƒ์˜ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ธฐ์— ์ข‹๋‹ค.

์Šคํƒ์˜ ๊ตฌ์กฐ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์š”์•ฝํ•˜๋ฉด ์š”๋Ÿฐ ๋Š๋‚Œโ€ฆ?๐Ÿค”

Source : GIPHY

Source : GIPHY

์Šคํƒ์€ ์œ„ ์›€์งค ์ฒ˜๋Ÿผ ์ž๋ฃŒ๋ฅผ ์Œ“์•„ ์„œ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•˜๋ฉด ๋œ๋‹ค.

์‰ฝ๊ฒŒ ์ดํ•ด๊ฐ€ ์•ˆ๋œ๋‹ค๋ฉด ํ–„๋ฒ„๊ฑฐ์— ๋“ค์–ด๊ฐ€๋Š” ์ฐธ๊นจ ๋นต, ํŒจํ‹ฐ, ์–‘์ƒ์ถ”, ์น˜์ฆˆ ๋“ฑ์˜ ์š”์†Œ๋ฅผ ๋ชจ๋‘ ์ž๋ฃŒ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ์ˆ˜์›”ํ•  ๊ฒƒ์ด๋‹ค.

๋นฑ๋น ๋น ๋ผ๋น ๐Ÿ”

์Šคํƒ์˜ ํŠน์ง•?

์Šคํƒ์€ FILO์˜ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

FILO : First In Last Out ์˜ ์ค„์ž„ ๋ง๋กœ ์ฒซ ๋ฒˆ์งธ๋กœ ๋“ค์–ด๊ฐ„ ์ž๋ฃŒ๋Š” ๋‹ค์‹œ ๋นผ๋‚ผ ๋•Œ ์ œ์ผ ๋งˆ์ง€๋ง‰์— ๋‚˜์˜จ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ์ง€๋‹ˆ๊ณ  ์žˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์™„์„ฑ๋œ ํ–„๋ฒ„๊ฑฐ์—์„œ ๋งŒ์•ฝ ํ”ผํด์„ ๋นผ๊ณ  ์‹ถ๋‹ค๋ฉด ํ”ผํด ์œ„์— ์žˆ๋Š” ๋นต๊ณผ ๊ทธ ์ด์™ธ์˜ ์š”์†Œ๋“ค์„ ๋ชจ๋‘ ๋“ค์–ด ์˜ฌ๋ ค์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•˜๋ฉด ์‰ฌ์šธ ๊ฒƒ ์ด๋‹ค.

๋”ฐ๋ผ์„œ ์–ด๋–ค ์Šคํƒ์— 1, 2, 3, 4, 5, 6, 7, 8, 9 ๊ฐ€ ์ฐจ๋ก€๋Œ€๋กœ ์ถ”๊ฐ€๋˜๋ฉด ๋‹ค์‹œ ๋นผ๋‚ผ ๋•Œ๋Š” 9, 8, 7, 6, 5, 4, 3, 2, 1

๋ฐฐ๊ฒฝ ์ง€์‹์€ ์ด ์ •๋„๋ฉด ์ถฉ๋ถ„ํ•  ๊ฒƒ ๊ฐ™๊ณ  ํ•œ๋ฒˆ ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž.

๋ฌธ์ œ ํ’€์ด

์ด ๋ฌธ์ œ๋Š” ์Šคํƒ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๊ณ  ์ด ๋ฌธ์ œ์—์„œ ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ์Šคํƒ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋Š” ๋Œ€๋žต 10000์ด๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์ˆ˜ ํ˜• ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ์ฃผ๋„๋ก ํ•œ๋‹ค.

#include <stdio.h>

int stack[10000];
...

int main()
{
...
}

๋˜ ๋ช…๋ น์–ด๋ฅผ ๋ฐ›์„ ๊ฐœ์ˆ˜ ๋˜ํ•œ ์ž…๋ ฅ ๋ฐ›์•„์•ผ ํ•˜๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž…๋ ฅ ๋ฌธ ๊ณผ ๊ณ„์†ํ•ด์„œ ๋ช…๋ น์–ด๋ฅผ ๋ฐ˜๋ณต ์ ์œผ๋กœ ์ž…๋ ฅ ๋ฐ›์•„์•ผ ํ•˜๋ฏ€๋กœ ์ด๋ฅผ ์œ„ํ•œ ๋ฐ˜๋ณต๋ฌธ๊ณผ ์ž…๋ ฅ ๋ฌธ ๋˜ํ•œ ์ ์–ด์ค€๋‹ค.

#include <stdio.h>

...

int main()
{
	int n,command[10];
	scanf("%d",&n);
	for (int i = 0; i < n; i++)
  {
     scanf("%s", command);
	}
	...
}

์ด ์ •๋„๋ฉด ์œ ์ €๋กœ ๋ถ€ํ„ฐ ๋ฐ›์•„์•ผํ•  ์ž…๋ ฅ๋ถ€๋ถ„์€ ๋ชจ๋‘ ์™„์„ฑ์ด ๋˜๊ฒŒ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์„œ ์ง€๊ธˆ๊นŒ์ง€ ์ณ์˜จ ์†Œ์Šค์™€์˜ ์ฐจ์ด์ ์ด๋ผ๋ฉด ๋ช…๋ น์–ด๋ฅผ ๋ฐ›์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— command๋ผ๋Š” ๋ฌธ์ž์—ด ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ๋ฌธ์ž์—ด์„ ์ž…๋ ฅ ๋ฐ›๋„๋ก ํ•˜์˜€๋‹ค๋Š” ์ ์ด๋‹ค.

๊ทธ ๋‹ค์Œ์—๋Š” ๋ฌธ์ œ์—์„œ ๋งํ•˜๋Š” ๋‹ค์Œ 5๊ฐœ์˜ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๊ตฌํ˜„ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

Push, Pop, Size, Empty, Top

๋‚˜๋Š” ์ด 5๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•ด์ฃผ์—ˆ๋‹ค.

#include <stdio.h>

...
int size_cnt=0;
void pull_internal(void) //์Šคํƒ ๋งจ ์œ—๋ถ€๋ถ„์˜ ๋นˆ๊ณต๊ฐ„์„ ๋งค์šฐ๊ธฐ ์œ„ํ•ด ์ž๋ฃŒ๋“ค์„ ์•ž์œผ๋กœ ๋‹น๊ธฐ๋Š” ํ•จ์ˆ˜
{
    while (stack[0] == 0)
    {
        for (int i = 0; i < size_cnt; i++)
            stack[i] = stack[i + 1];
    }

}
void push_internal(void) //์Šคํƒ์— ์ƒˆ๋กœ์šด ์ž๋ฃŒ๋ฅผ ์‚ฝ์ž…ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ž๋ฃŒ๋ฅผ ๋’ค๋กœ ๋ฏธ๋ฃจ๋Š” ํ•จ์ˆ˜
{
    for (int i = size_cnt; i > 0; i--)
        stack[i] = stack[i - 1];
}

void push(int input) //Push ๊ธฐ๋Šฅ
{
    if (size_cnt != 0)
        push_internal();
    stack[0] = input;
    size_cnt++;
}
void pop(void)  //Pop ๊ธฐ๋Šฅ
{
    if (size_cnt == 0)
        printf("-1\n");
    else
    {
        int tmp = stack[0];
        stack[0] = 0;
        if (size_cnt != 1)
            pull_internal();
        size_cnt--;
        printf("%d\n", tmp);
    }
}
void size(void)  //Size ๊ธฐ๋Šฅ
{
    printf("%d\n", size_cnt);
}
void empty(void)  //Empty ๊ธฐ๋Šฅ
{
    int tmp = size_cnt ==

ํ•จ์ˆ˜ ํ•˜๋‚˜ํ•˜๋‚˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ ๋‚˜์ค‘์— ๊ธฐํšŒ๊ฐ€ ๋œ๋‹ค๋ฉด ์ด ๊ฒŒ์‹œ๊ธ€์— ์ถ”๊ฐ€ํ•˜๋“ ์ง€ ๋ณ„๋„์˜ ๊ฒŒ์‹œ๊ธ€๋กœ ์ž‘์„ฑํ•ด๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ฒ ๋‹ค.

์ ˆ๋Œ€ ๊ท€์ฐฎ์•„์„œ ๊ทธ๋Ÿฐ๊ฒŒ ์•„๋‹ˆ๋‹ค๐Ÿ˜‘

์œ„ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๊ตฌํ˜„ํ•œ ๋‹ค์Œ ์ด๋ฒˆ์—๋Š” ๋ช…๋ น์–ด๋ฅผ ๋ฐ›์•„ ๋“ค์ด๊ณ  ํ•ด์„์„ ํ•˜๋Š” ๋ถ€๋ถ„์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋ถ€๋ถ„์€ if ๋ฌธ๊ณผ if else ๋ฌธ์„ ์ด์šฉํ•˜๋ฉด ์–ด๋ ต์ง€ ์•Š๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„๊ฑฐ๋ผ ์ƒ๊ฐํ–ˆ์œผ๋‚˜ ๋ฌธ์ œ๋Š” ๋‹ค๋ฅธ์–ธ์–ด์™€ ๋‹ฌ๋ฆฌ C์–ธ์–ด๋Š” ๋‚ด๊ฐ€ ์•Œ๋˜ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ž์—ด์„ ๋น„๊ตํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹คโ€ฆ;;;

์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด์—์„œ ํ˜•์‹์€ ์•ฝ๊ฐ„ ๋‹ค๋ฅด์ง€๋งŒ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ผด๋กœ ๋น„๊ต์‹์„ ์“ฐ๊ณค ํ•˜์˜€๋‹ค.

if(variable == "ํ…Œ์ŠคํŠธ")
{
	...
}

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ƒฅ C์–ธ์–ด์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ์“ธ ์ˆ˜ ์—†์Œ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ  ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ณด๊ฒŒ ๋˜์—ˆ๊ณ  ๊ทธ๊ฒฐ๊ณผ strcmpํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋œ๋‹ค๋Š” ์ ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

strcmpํ•จ์ˆ˜์— ๊ฒฝ์šฐ string.h๋ผ๋Š” ํ—ค๋”ํŒŒ์ผ์— ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ด ๋ฌธ์ œ์—์„œ ํ™œ์šฉํ•œ ๋งŒํผ๋งŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช… ํ•ด ๋ณด๋ฉด strcmpํ•จ์ˆ˜์— ๋‘๊ฐœ์˜ ๋ฌธ์ž์—ด ๋˜๋Š” ๋ฌธ์ž์—ด ๋ณ€์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉฐ, ๋‘ ๋ฌธ์ž์—ด์ด ๊ฐ™์„๊ฒฝ์šฐ 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, "top") == 0)
            top();
    }

    return 0;
...

์ด๋ ‡๊ฒŒ ๋ชจ๋“  ์†Œ์Šค๋ฅผ ๋‹ค ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉฐ ํ’€ ์†Œ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int stack[10000], size_cnt = 0;
void pull_internal(void)
{
    while (stack[0] == 0)
    {
        for (int i = 0; i < size_cnt; i++)
            stack[i] = stack[i + 1];
    }

}
void push_internal(void)
{
    for (int i = size_cnt; i > 0; i--)
        stack[i] = stack[i - 1];
}

void push(int input)
{
    if (size_cnt != 0)
        push_internal();
    stack[0] = input;
    size_cnt++;
}
void pop(void)
{
    if (size_cnt == 0)
        printf("-1\n");
    else
    {
        int tmp = stack[0];
        stack[0] = 0;
        if (size_cnt != 1)
            pull_internal();
        size_cnt--;
        printf("%d\n", tmp);
    }
}
void size(void)
{
    printf("%d\n", size_cnt);
}
void empty(void)
{
    int tmp = size_cnt == 0 ? 1 : 0;
    printf("%d\n", tmp);
}
void top(void)
{
    if (size_cnt == 0)
        printf("-1\n");
    else
        printf("%d\n", stack[0]);
}
void show(void)
{
    for (int i = 0; i < size_cnt; i++)
        printf("%d\n", stack[i]);
}
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, "top") == 0)
            top();
    }

    return 0;
}

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