๋ฌธ์
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