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