๐ป๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ(Dijikstra's Algorithm)
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ด๋ ๊ฐ์ค์น ๊ทธ๋ํ์์ ํ ์ ์ ์ผ๋ก๋ถํฐ ๋ชจ๋ ์ ์ ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๋ค์ต์คํธ๋ผ์ ๊ฒฝ์ฐ ๊ฐ์ค์น์ ์์๊ฐ ์กด์ฌํ๋ฉด ์๋๋ค๋ ์ ์ฝ์ฌํญ์ด ์กด์ฌํ๋ค.
๐ถ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์๋ฆฌ
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ณธ์ ์ธ ์๋ฆฌ๋ ๊ต์ฅํ ๊ฐ๋จํ๋ค. ๋๊ฐ์ง ์์ ์ ๋ชจ๋ ์ ์ ์ ๋ชจ๋ ๋ฐฉ๋ฌธํ ๋๊น์ง ๋ฐ๋ณตํ๋ ๊ฒ์ด๋ค.
1. ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์ค ๊ฐ์ฅ cost๊ฐ ์์ ์ ์ ์ ๋ฐฉ๋ฌธํ๋ค.
2. ํด๋น ์ ์ ๊ณผ ์ฐ๊ฒฐ๋ ์ ์ ๋ค ์ค์์ ๊ฑฐ๋ฆฌ๊ฐ ์ด์ ์ ๊ธฐ๋กํ ๊ฐ๋ณด๋ค ์๋ค๋ฉด ๊ฐ์ ๊ฐฑ์ ํ๋ค
์ด ๋์์ ์ ๋ฌดํ ๋ฐ๋ณตํ๋ ๊ฒ์ธ๋ฐ, ๊ธ๋ก๋ง ๋ณด๋ฉด ๋ฌด์จ ๋ง์ธ์ง ์ดํดํ๊ธฐ ํ๋ค ์ ์์ผ๋ ๊ทธ๋ฆผ์ ํตํด ์์๋ณด์.
6๊ฐ์ ์ ์ ์ด ์๊ณ ๊ฐ ์ ์ ์ฌ์ด์ cost๊ฐ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ๊ทธ๋ํ์์ 0๋ฒ ์ ์ ์ ๋ํด์ ๋ชจ๋ ์ ์ ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ์ํฉ์ ๊ฐ์ ํด๋ณด๊ฒ ๋ค.
์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด์ ๊ฐ์ ๋ชจ๋ ๋ฌดํ๋์ ๊ฐ์ผ๋ก ์ค์ ํ๊ณ 0๋ฒ์ ๋ํด์๋ ์๊ธฐ ์์ ์ด๋ฏ๋ก 0์ผ๋ก ์ค์ ํด์ค๋ค.
๋จผ์ , 0๋ฒ ์ ์ ์ ๋ฐฉ๋ฌธํ์ฌ ๊ทธ์ ์ฐ๊ฒฐ๋ 1, 3๋ฒ ์ ์ ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ค. ๋งจ์ฒ์ ๊ณ์ฐ์ด๋ผ ๋ฌด์กฐ๊ฑด ํด๋น ๊ฑฐ๋ฆฌ๊ฐ ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ์ด ๋๊ฒ ์ง๋ง, ์๊ณ ๋ฆฌ์ฆ์ ์ํด ์ค๋ช ์ ํ๋ฉด ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด์ bset๋ผ๊ณ ํ๋ฉด
best[1] ๊ณผ best[0] + (0๊ณผ 1์ฌ์ด์ ๊ฑฐ๋ฆฌ)๋ฅผ ๋น๊ตํ์ฌ ์์๊ฐ์ best[1]์ ๋ฃ๋๋ค. ๋ฌดํ๋ ๊ฐ๊ณผ 15๋ฅผ ๋น๊ตํ๋ฉด 15๊ฐ ์์ผ๋ฏ๋ก 15๊ฐ best[1]์ ๋ค์ด๊ฐ๊ฒ ๋๋๊ฒ์ด๋ค.
๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก 3๋ฒ์ ์ ๊ณผ์ ๊ฑฐ๋ฆฌ๋ ๊ตฌํ์ฌ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํ๋ค.
๊ทธ๋ ๊ฒ ์ธ์ ์ ์ ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ฉด ๋ค์ ์ ์ ์ ๋ฐฉ๋ฌธํ๋๋ฐ, ๊ฐ์ฅ ์์ ๊ฐ์ ์ป์ 1๋ฒ ์ ์ ์ ์ฐ์ ์ผ๋ก ๋ฐฉ๋ฌธํ๋ค.
์์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก 1๋ฒ์ ๋ํด์ ์ธ์ ์ ์ ๊ณผ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๋๋ฐ (0์ผ๋ก๋ถํฐ 1๋ฒ์ ์ต๋จ๊ฑฐ๋ฆฌ) + 2๋ฒ์ ๊ฑฐ๋ฆฌ๋ฅผ best์ ์๋ ๊ฐ๊ณผ ๋น๊ตํ์ฌ ์์ ๊ฐ์ ๋ฃ๋๋ค.
3๋ฒ ์ ์ ์ ๋ํด์๋ (0์ผ๋ก๋ถํฐ 1๋ฒ์ ์ต๋จ๊ฑฐ๋ฆฌ) + (1๋ฒ๊ณผ 3๋ฒ์ ๊ฑฐ๋ฆฌ) = 25์ด๊ณ ํ์ฌ best์ ๋ค์ด๊ฐ์๋ ๊ฐ์ 1๋ฒ์์ 3๋ฒ์ผ๋ก ๋ฐ๋ก๊ฐ๋ ๊ฑฐ๋ฆฌ์ธ 35์ธ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ํตํด์ 1๋ฒ์์ 3๋ฒ์ผ๋ก ๋ฐ๋ก๊ฐ๋ ๊ฒ๋ณด๋ค 1๋ฒ์ ๊ฑฐ์ณ์ 3๋ฒ์ผ๋ก ๊ฐ๋ ๋ฐฉ๋ฒ์ด ๋ ์งง๋ค๋ ๊ฒ์ด ๋ฐํ์ก์ผ๋ฏ๋ก ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ 15 + 10์ธ 25๋ก ๊ฐฑ์ ์์ผ์ค๋ค.
๋ค์ 2๋ฒ์ ์ ์ ๋ฐฉ๋ฌธํ๊ฒ ๋๋๋ฐ 2๋ฒ์ ์ ์ ์ฐ๊ฒฐ๋ ์ธ์ ์ ์ ์ด ์์ผ๋ฏ๋ก ๋์ด๊ฐ๋ค.
๋ฐ๋ก ๋ค์ 3๋ฒ์ ์ ์ผ๋ก ๋์ด๊ฐ์ 4๋ฒ์ ์ ๊ณผ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ค.
(0์์ 3๋ฒ์ผ๋ก๊ฐ๋ ์ต๋จ๊ฑฐ๋ฆฌ) + (3์์ 4๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ) = 30 < best[4] = INF ์ด๋ฏ๋ก best[4]๋ 30์ผ๋ก ๊ฐฑ์ ๋๋ค.
5๋ฒ ์ ์ ์ 0๋ฒ์ผ๋ก๋ถํฐ ๊ฐ๋ฐฉ๋ฒ์ด ์์ผ๋ฏ๋ก ๋ฌดํ๋๊ฐ์ผ๋ก ๊ทธ๋๋ก ๊ฐ๊ณ ๊ฐ์ ์๋ ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํ์์ผ๋ฏ๋ก ์๊ณ ๋ฆฌ์ฆ์ด ๋๋๊ฒ ๋๋ค. ์๊ณ ๋ฆฌ์ฆ์ด ๋๋๊ฒ ๋๋ฉด 0๋ฒ์ผ๋ก๋ถํฐ ๊ฐ ์ ์ ์ผ๋ก ๊ฐ๋ ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ๋ชจ๋ ๊ตฌํด์ง ๊ฒ์ ๋ณผ ์ ์๋ค.
๊ทธ๋ฆผ์ผ๋ก ๋ณด๋๊น ํจ์ฌ ๊ฐ๋จํ๋ค.
๋ฐฉ๋ฌธํ ์ ์ ์ ์ ํด์ฃผ๊ณ (์ฐ์ ์์๋ cost๊ฐ ์ ์ ์ ์ ์ฐ์ ), ํ์ฌ ์ ์ ์ i, ๋ฐฉ๋ฌธํ ์ ์ ์ j๋ผ๊ณ ํ๋ฉด
best[i] + distance[i->j] ์ best[j]์ค ์์ ๊ฐ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ก ๊ฐฑ์ ํด์ฃผ๋ ๊ฒ์ด๋ค.
๋ ๊ฐ๋จํ๊ฒ ํํํด๋ณด์๋ฉด min(best[i] + distance[i->j], best[j])๋ก ์ธ ์ ์๊ฒ ๋ค.
๐ถ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํ
๊ธฐ๋ณธ์ ์ธ ์๋ฆฌ๋ฅผ ์์์ผ๋ฏ๋ก ์ฝ๋๋ก ๊ตฌํํด๋ณด๋๋ก ํ์. C++์ฝ๋๋ก ์์ฑ๋์๋ค.
void Dijikstra(int here, int size)
{
struct VertexCost
{
int vertex;
int cost;
};
list<VertexCost> discoverd;
vector<int> best(size, INT32_MAX);
vector<int> parent(size, -1);
discoverd.push_back(VertexCost{ here, 0 });
best[here] = 0;
parent[here] = here;
while (!discoverd.empty())
{
list<VertexCost>::iterator bestIt;
int bestCost = INT32_MAX;
for (auto it = discoverd.begin(); it != discoverd.end(); ++it)
{
if (it->cost < bestCost)
{
bestCost = it->cost;
bestIt = it;
}
}
int cost = bestIt->cost;
here = bestIt->vertex;
discoverd.erase(bestIt);
if (best[here] < cost)
continue;
for (int there = 0; there < size; there++)
{
if (adjacent[here][there] == -1)
continue;
int nextCost = best[here] + adjacent[here][there];
if (nextCost >= best[there])
continue;
discoverd.push_back(VertexCost{ there, nextCost });
best[there] = nextCost;
parent[there] = here;
}
}
}
์ ์ฒด์ ์ธ ์ฝ๋๋ ์ด๋ ๊ณ ํ๋์ฉ ์ดํด๋ณด๋๋กํ์.
struct VertexCost
{
int vertex;
int cost;
};
list<VertexCost> discoverd;
vector<int> best(size, INT32_MAX);
vector<int> parent(size, -1);
discoverd.push_back(VertexCost{ here, 0 });
best[here] = 0;
parent[here] = here;
๋จผ์ ์ฒ์ ์ ์ ์ ์ง์ ํด์ฃผ๋ ์์ ์ด๋ค. ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๋ํ๋ด๋ ๋ฐฐ์ด์ธ best์ ๊ฐ์ ๋ชจ๋ ๋ฌดํ๋์ ๊ฐ์ผ๋ก ์ค์ ํด์ฃผ๊ณ , ๋ฐฉ๋ฌธํ ์ ์ ์ ๋ชฉ๋ก์ธ discoverd๋ผ๋ list๋ ๋ง๋ค์ด์ค๋ค. ๊ทธ๋ฆฌ๊ณ ๋งจ์ฒ์ ์์์ ์ ์ ๋ฐฉ๋ฌธ๋ชฉ๋ก์ ๋ฃ์ด์ฃผ๋ฉด์ ์๊ณ ๋ฆฌ์ฆ์ด ์์๋๋ค.
while (!discoverd.empty())
{
list<VertexCost>::iterator bestIt;
int bestCost = INT32_MAX;
for (auto it = discoverd.begin(); it != discoverd.end(); ++it)
{
if (it->cost < bestCost)
{
bestCost = it->cost;
bestIt = it;
}
}
int cost = bestIt->cost;
here = bestIt->vertex;
discoverd.erase(bestIt);
if (best[here] < cost)
continue;
for (int there = 0; there < size; there++)
{
if (adjacent[here][there] == -1)
continue;
int nextCost = best[here] + adjacent[here][there];
if (nextCost >= best[there])
continue;
discoverd.push_back(VertexCost{ there, nextCost });
best[there] = nextCost;
parent[there] = here;
}
}
์ค์ง์ ์ผ๋ก ์๊ณ ๋ฆฌ์ฆ์ด ์ํ๋๋ ๋ถ๋ถ์ธ๋ฐ, ์ด ๋ถ๋ถ๋, ๋ค์ ๋ฐฉ๋ฌธํ ์ ์ ์ ๊ณ ๋ฅด๋ ์์ , ์ ์ ์์ ์ฐ๊ฒฐ๋ ์ ์ ๋ค์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ์์ ๋๊ฐ์ง๋ก ์ฐข์ด์ ๋ณด๋๋กํ๊ฒ๋ค.
list<VertexCost>::iterator bestIt;
int bestCost = INT32_MAX;
for (auto it = discoverd.begin(); it != discoverd.end(); ++it)
{
if (it->cost < bestCost)
{
bestCost = it->cost;
bestIt = it;
}
}
int cost = bestIt->cost;
here = bestIt->vertex;
discoverd.erase(bestIt);
if (best[here] < cost)
continue;
๋จผ์ ๋ฐฉ๋ฌธํ ์ ์ ์ ๊ณ ๋ฅด๋ ๋ถ๋ถ์ด๋ค. ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ๋๋ง๋ค, ๋ฐฉ๋ฌธ๋ชฉ๋ก์ ๊ทธ ์ ๋ณด๋ฅผ ๋ฃ์ด์ฃผ๊ฒ๋๋๋ฐ ๊ทธ์ค์์ cost๊ฐ์ด ๊ฐ์ฅ ์์ ์ ์ ์ ์ฐพ์์ ๊ณจ๋ผ์ค๋ค. ๊ทธ๋ฆฌ๊ณ ๊ณ ๋ฅธ ์ ์ ์ ๋ฐฉ๋ฌธ๋ชฉ๋ก์์ ์ญ์ ํด์ฃผ๊ณ ์ด์ ์ด ๊ณ ๋ฅธ์ ์ ์ ์ฐ๊ฒฐ๋ ์ ์ ์๋ํ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ์ผ์ ์ํํ ๊ฒ์ด๋ค.
if (best[here] < cost)
continue;
์ด ์ฝ๋๋ฅผ ๋ฃ์์ด์ ๋ ๋ ์งง์ ๊ฒฝ๋ก๋ฅผ ์ฐพ์๋ค๋ฉด ์ฝ๋์ ๋ฌดํ๋ฐ๋ณต์ด๋ ๋นํจ์จ์ ์ธ ์์ ์ ํผํ๊ธฐ์ํด ๋ฃ์ ์ฝ๋์ธ๋ฐ, ์๋ฅผ ๋ค์๋ฉด ์์ ๊ทธ๋ฆผ์์ 0 ->3์ผ๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ์ธ 35๊ฐ ๋งจ์ฒ์ ๋ฐฉ๋ฌธ๋ชฉ๋ก์ ๋ค์ด์๋๋ฐ, ๋ค๋ฆ๊ฒ 0์์ 1์ ๊ฑฐ์ณ 3์ผ๋ก ๊ฐ๋ ๊ฒ์ด ๋ ์งง๋ค๋ ๊ฒ์ด ๋ฐํ์ง๊ณ , 0 -> 3์ผ๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ 25๊ฐ ๋ ๋ฐฉ๋ฌธ๋ชฉ๋ก์ ๋ค์ด์ค๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ ์์ ์ฝ์คํธ๋ฅผ ๋จผ์ ๋ฐฉ๋ฌธํ๋ฏ๋ก (3, 35)์ง๋ฆฌ๋ ๊ณ์์์ ๋ฆฌ์คํธ์ ๋จ์์๋ค๊ฐ ๋ง์ง๋ง์ ์คํ์ด ๋ ํ ๋ฐ, ์ด๋ฏธ 3๋ฒ์ ๋ํด์ ๊ณ์ฐ์ด ๋๋ฌ๋๋ฐ ๋๊ฐ์ ์์ ์ ๋ ์ํํ๊ฒ ๋๊ณ ๋ฌดํ๋ฐ๋ณต์ ํ๊ฒ๋๋ค. ๊ทธ๋์ ์ ์ฝ๋๋ฅผ ๋ฃ์ด์ ์ค๋ณต๋ ๊ฐ์ค์ ์ฝ์คํธ๊ฐ ํฐ๊ฐ์ ๊ทธ๋ฅ ๋ ๋ ค์ฃผ๋ ๊ฒ์ด๋ค. ๋ง๋กํ๋ฉด ์ดํด๊ฐ ์์๋ ์ ์๋๋ฐ ์ ์ฝ๋๋ฅผ ๋นผ๊ณ ํ๋ฒ ์คํํด๋ณด๋ฉด ๋ฌด์จ ๋ง์ธ์ง ์ ์ ์์ ๊ฒ์ด๋ค.
for (int there = 0; there < size; there++)
{
if (adjacent[here][there] == -1)
continue;
int nextCost = best[here] + adjacent[here][there];
if (nextCost >= best[there])
continue;
discoverd.push_back(VertexCost{ there, nextCost });
best[there] = nextCost;
parent[there] = here;
}
๊ทธ๋ฌ๋ฉด ๋ง์ง๋ง์ผ๋ก ๋ฐฉ๋ฌธํ ์ ์ ์ ๊ณจ๋์ผ๋ฉด ๊ทธ ์ ์ ์ ๋ํด์ ์ฐ๊ฒฐ๋ ์ ์ ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ์์ ์ ์ํํ๋๋ฐ,
MIN(best[there] , best[here] + adjacent[here][there])๊ณผ ๊ฐ์ ์์ ์ ์ํํ์ฌ ๊ทธ๊ฐ์ ๊ฐฑ์ ํ๊ณ ๊ฐฑ์ ์ด ๋์๋ค๋ฉด, ํด๋น ์ ์ ์ ๋ฐฉ๋ฌธ๋ชฉ๋ก์ ๋ฃ์ด์ฃผ๊ฒ ๋๋ค.
๐ถ์๊ฐ๋ณต์ก๋
์์ ๊ตฌํํ ์ฝ๋๋ ๋ฐฉ๋ฌธ๋ชฉ๋ก์ ๋ด๋ ์๋ฃ๊ตฌ์กฐ๋ก list๋ฅผ ์ ํํ์๋ค.
๊ทธ๋ ๊ฒ๋๋ฉด ๋ฐฉ๋ฌธํ ์ ์ ๋ฅผ ํ์ํ๋๋ฐ ์ต์ ์ ๊ฒฝ์ฐ O(V)
ํด๋น ์ ์ ์์ ์ฃผ๋ณ ๋ ธ๋๋ค์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ์ฌ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํ๋ ๊ณผ์ ์ด O(V)
์ธ๋ฐ O(V) + O(V) = O(V)์ด๊ณ ์ด๋ฅผ V๋ฒ ๋ฐ๋ณตํ๋ฏ๋ก O(V^2)์ด ๋๋ค.
๋ฐ๋ผ์ ๋ฐฐ์ด์ ํตํ์ฌ ๊ตฌํํ์์ ๊ฒฝ์ฐ ์๊ฐ๋ณต์ก๋๋ O(V^2)์ด๋ค.
ํ์ง๋ง ๋ฐฉ๋ฌธ๋ชฉ๋ก์ ๋ด๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฐ์ ์์ํ๋ฅผ ์ฌ์ฉํ๋ฉด ์๊ฐ๋ณต์ก๋๋ฅผ ์ค์ผ ์ ์๋๋ฐ, ์ด๋ถ๋ถ์ ๋ํด์๋ ์ฐ์ ์์ํ๋ฅผ ๋จผ์ ์ ๋ฆฌํ๊ณ ๋ค์ ํฌ์คํ ํด๋ณด๋๋กํ๊ฒ ๋ค.
๐ป๋ง์น๋ฉฐ
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๊ฒฝ์ฐ ๋งจ์ฒ์์ ๊ณต๋ถ๋ฅผ ํ ๋๋ ๋๊ฒ ์ด๋ ค์ด ์๊ณ ๋ฆฌ์ฆ์ธ์ค ์์๋๋ฐ ๋ง์ ํ๋ํ๋์ฉ ์คํ ์ ๋ฐ๋ผ๊ฐ๋ณด๋ฉฐ ๊ณต๋ถํด๋ณด๋ ์๊ฐ๋ณด๋ค ๊ต์ฅํ ๊ฐ๋จํ ์๊ณ ๋ฆฌ์ฆ์ด์๋ค. ๋ํ ํ์ฉ๋ฐฉ์๋ ๊ต์ฅํ ๋ง์ ์๊ณ ๋ฆฌ์ฆ์ธ ๊ฒ ๊ฐ์์ ํ์คํ๊ฒ ์๊ฒจ๋๊ธฐ์ํด ์ ๋ฆฌํด ๋ณด์๋ค. ์ฐ์ ์์ํ๋ฅผ ํตํ ๊ตฌํ์ ๋ํด์๋ ๋ ๊ณต๋ถํด์ ์ ๋ฆฌํด๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ์ผํ ๊ฒ๊ฐ๋ค.
'CS > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ๊น์ด ์ฐ์ ํ์(DFS)๊ณผ ๋๋น ์ฐ์ ํ์(BFS) (0) | 2021.05.30 |
---|
๊ฒ์๊ฐ๋ฐ์๋ฅผ ๊ฟ๊พธ๋ ๋ํ์์ ๊ฐ๋ฐ ๊ณต๋ถ ๋ธ๋ก๊ทธ
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!