[0์ฃผ์ฐจ] ์์ด(permutation)๊ณผ ์กฐํฉ(combination) - ์์ดํธ
๐ ์์ด๊ณผ ์กฐํฉ
์์ด(permutation)์ด๋ ?
n ๋ช ์ค์ r๋ช ์ ๋ฝ์์ ์ค์ธ์ฐ๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ์๋ฏธํ๋ค.
์กฐํฉ(combination)์ด๋ ?
์์์ ๊ณ ๋ ค ์์ด ๋จ์ํ๊ฒ ์ ํ๋ง ํ๋ ๊ฒฝ์ฐ์ ์, n ๋ช ์ค์ r๋ช ์ ๋ฝ๊ธฐ๋ง ํ๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ์๋ฏธํ๋ค.
โโ
4C2๋ฅผ ๊ตฌํ๋ ๊ณต์์ ์์ด์ ๊ตฌํ๋ ๊ณต์๋ณด๋ค๋ ์กฐ๊ธ ์ด๋ ต๋ค. ์์ด๋ฌ๋ํ๊ฒ๋ ์กฐํฉ์ ๊ตฌํ๊ธฐ ์ํด์๋ ์์ด์ ๋จผ์ ๊ตฌํ ํ, ์ ๊ฑฐ์ํค๋ฉด ๋๋ค. (์ ์ง๋ฌ๋๊ณ ์ทจ์ํ๋ ๋ฐฉ์) ์ฆ 4C2 = 4P2/2! ์ด ๋๋ค.
์์ด์ ๋จผ์ ๊ตฌํ ํ, ํฉํ ๋ฆฌ์ผ๋ก ๋๋๋ฉด ์กฐํฉ์ ์๋ฅผ ๊ตฌํ ์ ์๋ค.
๐ C++ ์์์ ์์ด next_permutation(from,to) / prev_permutation(from,to)
C++ ์์๋ ์์ด์ ๊ตฌํ๋ ํจ์๊ฐ ๋ฏธ๋ฆฌ ์ค๋น๋์ด ์๋ค. ๊ทธ ์ค next_permutation() ํจ์๋ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ๊ธฐ๋ฐ์ผ๋ก ์ค๋ฆ์ฐจ์ ์ผ๋ก ์์ด์ ๋ง๋ ๋ค. ๊ทธ์ ๋ฐํด prev_permutation์ ๋ด๋ฆผ์ฐจ์ ์ ๊ธฐ๋ฐ์ผ๋ก ์์ด์ ๋ง๋ ๋ค.
์ฐ์ ์ next_permutation() ํจ์์ ์ฐ๋ ๋ฐฉ๋ฒ๋ถํฐ ์์๋ณด์.
next_permutation() ์ ์กฐ๊ฑด
- next_permutation()์ ์ฌ์ฉํ๋ ค๋ฉด ์ฐ์ ํค๋์ <algorithm> ํ์ผ์ ์ถ๊ฐํด์ฃผ์ด์ผํ๋ค.
- ๋ฐฐ์ด์ด sorting ๋์ด ์์ด์ผ ํ๋ค
next_permutation() ์ ํ๋ผ๋ฏธํฐ
- ์ฐ์ from์ ๋ฐฐ์ด์ ์์์ ์๋ฏธํ๋ค.
- to๋ ๋ฐฐ์ด์ ๋ง์ง๋ง์ด ์๋ ๋ง์ง๋ง ๋ถ๋ถ ๋ค์์ ํ๋ผ๋ฏธํฐ๋ก ๋ฃ์ด์ฃผ์ด์ผํ๋ค.
- ์๋ฅผ ๋ค์ด, ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ 2์ธ ๋ฐฐ์ด์ด ์๋ค๋ฉด next_purmuation(0,2)์ด ๋ค์ด๊ฐ ์ฃผ์ด์ผ ํ๋ค.
next_permutation() ์์ ์ฝ๋
์ฝ๋ ์์
- ์ด๊ธฐ ๋ฐฐ์ด: a = {1, 2, 3}.
- ์ถ๋ ฅ: 1 2 3 (for๋ฌธ์ด ์ฒซ ๋ฒ์งธ ์ถ๋ ฅ๋ฌธ๋ง ํฌํจํ๊ณ ์์).
- std::next_permutation์ ํธ์ถํด ๋ค์ ์์ด์ ๊ณ์ฐ.
- ๋ฐฐ์ด์ด ๋ณ๊ฒฝ: a = {1, 3, 2}.
- ์ถ๋ ฅ: 1 3 2.
- ์ ๊ณผ์ ๋ฐ๋ณต.
- ์์ด์ด ๋๋๋ฉด(๋ง์ง๋ง ์์ด: 3 2 1), ๋ฃจํ ์ข ๋ฃ.
next_permutation() ์์ฉ
์ง๊ธ๊น์ง ์์ด์ด ๋ ์ ์๋ 3P3์ ๋ง๋ค์ด๋ณด์๋ค๋ฉด 5P3์ฒ๋ผ ๋ชจ๋ ์๊ฐ ์๋ ํน์ ์๋ฅผ ๋ฝ์์ ์ถ๋ ฅํด๋ณด๋๋ก ํ์. ๋ฐฉ๋ฒ์ ์์ฃผ ๊ฐ๋จํ๋ค.
- ์ด๊ธฐ ๋ฐฐ์ด: a = {1, 2, 3, 4, 5}.
- ์งํฉ(set) ์ ์ธ : set<string> unique_results;
- ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์์์ ๊ณต๋ฐฑ ๊ทธ๋ฆฌ๊ณ ๋ ๋ฒ์งธ ์์๋ฅผ ๋ฌธ์์ด๋ก ๋ง๋ค์ด result์ ์ ์ฅ
- ์ ์ฅ๋ result๋ฅผ ์ ์ธํ์ฌ ์ ์ธํ์๋ ์งํฉ์ ์์๋ก ์ถ๊ฐ
- ์ ๊ณผ์ ๋ฐ๋ณต
- ์ค๋ณต ์ ๊ฑฐ๋ ์งํฉ๋ค์ ์์๋ฅผ ์ถ๋ ฅ ํ ๊ฐํ
๐ ์ฌ๊ทํจ์๋ก ๋ง๋๋ ์์ด
๋จ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ตฌํ๋ ํจ์๋ก ์์ด์ ๋ง๋๋ ๊ฒ์ ์ด๋ ต์ง ์์์ง๋ง, ์ง์ ์์ด ํจ์๋ฅผ ๋ง๋๋ ๊ฒ์ ์๊ฐ๋ณด๋ค ์ด๋ ค์ ๋ค.
๊ทธ ์ด์ ๋ ๋ฐ๋ณต๋ฌธ ์์ ์ฌ๊ทํจ์๋ฅผ ์ ๋ ฅํด์ผํ๋ ๊ฒ๊ณผ ๋์ ์ธ ์ธ๋ฑ์ค ๋๋ฌธ์ด์๋ ๊ฒ ๊ฐ๋ค. ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
๐ Pseudo Code
1) ๊ธฐ์ ์ฌ๋ก : ๊น์ด๊ฐ ์กฐํฉํ๋ ค๋ ์๊ฐ ๊ฐ๋ค๋ฉด -> if(depth == k)
2) ๋ฐฐ์ด์ ๊น์ด๋ถํฐ n ๋งํผ ๋ฐ๋ณต -> for (int i = depth; i < n; i++)
2-1) i๋ฒ์งธ ์์์ depth ๋ฒ์งธ ์์๋ฅผ ๊ตํ -> swap(a[i],a[depth]
2-2) ์ฌ๊ท ํจ์ ํธ์ถ -> permutation(depth+1)
2-3) ์์ ๋ณต๊ตฌ -> swap(a[i]) , a[depth])
์ฌ๊ธฐ์ ์ฃผ๋ชฉํด์ผํ ์ ์ makePrmutation์ ํจ์ ๋ถ๋ถ์ด๊ณ , ๊ทธ ์ค์์๋ ๋ฐ๋ณต๋ฌธ๊ณผ ์ฌ๊ทํจ์์ด๋ค.
๋ค์์ C++ ๋ฐฑํธ๋ํน ์ฝ๋๊ฐ n = 3, r = 3์ผ ๋ ์ฒ์๋ถํฐ ๋๊น์ง ์ด๋ป๊ฒ ์์ฐจ์ ์ผ๋ก ํธ์ถ๋๊ณ ๋ฐํ๋๋์ง, ์ด 31๋จ๊ณ์ ๊ฑธ์ณ ๋๊น ์์ด ์ ๋ฆฌํ ํ๋ฆ์ด๋ค.
์ ์ฒด ํ๋ฆ (์ธ๋ถ ๋จ๊ณ)
1) ํธ์ถ: f(3, 3, 0)
- depth = 0, ํ์ฌ v = [0, 1, 2]
- for(i = 0 ~ 2)
2) (์ ๋ฐฉํฅ swap, i=0)
- ์คํ: swap(v[0], v[0])
- ๋ฒกํฐ: ์ฌ์ ํ [0, 1, 2]
- ์ฌ๊ท ํธ์ถ: f(3, 3, 1)
3) ํธ์ถ: f(3, 3, 1)
- depth = 1, ํ์ฌ v = [0, 1, 2]
- for(i = 1 ~ 2)
4) (์ ๋ฐฉํฅ swap, i=1)
- ์คํ: swap(v[1], v[1])
- ๋ฒกํฐ: [0, 1, 2](๋ณํ ์์)
- ์ฌ๊ท ํธ์ถ: f(3, 3, 2)
5) ํธ์ถ: f(3, 3, 2)
- depth = 2, ํ์ฌ v = [0, 1, 2]
- for(i = 2 ~ 2) → ์ ์ผํ ๋ฐ๋ณต i=2
6) (์ ๋ฐฉํฅ swap, i=2)
- ์คํ: swap(v[2], v[2])
- ๋ฒกํฐ: [0, 1, 2](๋ณํ ์์)
- ์ฌ๊ท ํธ์ถ: f(3, 3, 3)
7) ํธ์ถ: f(3, 3, 3)
- depth = 3, r = 3 → ๊ธฐ์ ์กฐ๊ฑด ์ถฉ์กฑ
- ์์ด ์ถ๋ ฅ: [0, 1, 2]
- ์ฌ๊ท ๋ฐํ
8) ๋ณต๊ท: f(3, 3, 2)
- ์ด์ ์ญ๋ฐฉํฅ swap: swap(v[2], v[2])
- ๋ฒกํฐ: [0, 1, 2](๋ณํ ์์)
- i=2 ๋ฐ๋ณต ๋, for ๋ฌธ ์ข ๋ฃ
- ํจ์ f(3,3,2) ๋ฐํ
9) ๋ณต๊ท: f(3, 3, 1)
- ๋ฐฉ๊ธ i=1 ์ฒ๋ฆฌ ์๋ฃ
- ์ญ๋ฐฉํฅ swap: swap(v[1], v[1])
- ๋ฒกํฐ: [0, 1, 2]
- for ๋ฌธ์์ ๋ค์ i=2 ์งํ
10) (์ ๋ฐฉํฅ swap, i=2, depth=1)
- ์คํ: swap(v[2], v[1])
- ๋ฒกํฐ: [0, 2, 1] (์ธ๋ฑ์ค 1,2 ๊ตํ)
- ์ฌ๊ท ํธ์ถ: f(3, 3, 2)
11) ํธ์ถ: f(3, 3, 2)
- depth = 2, ํ์ฌ v = [0, 2, 1]
- for(i = 2 ~ 2)
12) (์ ๋ฐฉํฅ swap, i=2)
- ์คํ: swap(v[2], v[2])
- ๋ฒกํฐ: [0, 2, 1](๋ณํ ์์)
- ์ฌ๊ท ํธ์ถ: f(3, 3, 3)
13) ํธ์ถ: f(3, 3, 3)
- ๊ธฐ์ ์กฐ๊ฑด ์ถฉ์กฑ → ์ถ๋ ฅ: [0, 2, 1]
- ์ฌ๊ท ๋ฐํ
14) ๋ณต๊ท: f(3, 3, 2)
- ์ญ๋ฐฉํฅ swap: swap(v[2], v[2])
- ๋ฒกํฐ: [0, 2, 1](๋ณํ ์์)
- i=2 ๋, for ๋ฌธ ์ข ๋ฃ
- ํจ์ f(3,3,2) ๋ฐํ
15) ๋ณต๊ท: f(3, 3, 1)
- ๋ฐฉ๊ธ i=2 ์ฒ๋ฆฌ ์๋ฃ
- ์ญ๋ฐฉํฅ swap: swap(v[2], v[1])
- ๋ฒกํฐ: [0, 1, 2]
- ์ด์ i=1,2 ๋ชจ๋ ์ฒ๋ฆฌ → for ๋ฌธ ์ข ๋ฃ
- ํจ์ f(3,3,1) ๋ฐํ
16) ๋ณต๊ท: f(3, 3, 0)
- ๋ฐฉ๊ธ i=0 ์ฒ๋ฆฌ ์๋ฃ
(์ ํํ ๋งํ๋ฉด, i=0 ๋ธ๋ก + ๊ทธ ์์์ i=1,2๊น์ง ๋ค ๋๋ ๊ฒ์ด๊ณ , ํจ์๊ฐ ๋์์จ ์ํ) - ์ญ๋ฐฉํฅ swap: swap(v[0], v[0])
- ๋ฒกํฐ: [0, 1, 2](๋ณํ ์์)
- for ๋ฌธ์์ ๋ค์ i=1 ์งํ
17) (์ ๋ฐฉํฅ swap, i=1, depth=0)
- ์คํ: swap(v[1], v[0])
- ๋ฒกํฐ: [1, 0, 2] (์ธ๋ฑ์ค 0,1 ๊ตํ)
- ์ฌ๊ท ํธ์ถ: f(3, 3, 1)
18) ํธ์ถ: f(3, 3, 1)
- depth = 1, ํ์ฌ v = [1, 0, 2]
- for(i = 1 ~ 2)
19) (์ ๋ฐฉํฅ swap, i=1)
- ์คํ: swap(v[1], v[1])
- ๋ฒกํฐ: [1, 0, 2](๋ณํ ์์)
- ์ฌ๊ท ํธ์ถ: f(3, 3, 2)
20) ํธ์ถ: f(3, 3, 2)
- depth = 2, ํ์ฌ v = [1, 0, 2]
- for(i = 2 ~ 2)
21) (์ ๋ฐฉํฅ swap, i=2)
- ์คํ: swap(v[2], v[2])
- ๋ฒกํฐ: [1, 0, 2](๋ณํ ์์)
- ์ฌ๊ท ํธ์ถ: f(3, 3, 3)
22) ํธ์ถ: f(3, 3, 3)
- ๊ธฐ์ ์กฐ๊ฑด ์ถฉ์กฑ → ์ถ๋ ฅ: [1, 0, 2]
- ์ฌ๊ท ๋ฐํ
23) ๋ณต๊ท: f(3, 3, 2)
- ์ญ๋ฐฉํฅ swap: swap(v[2], v[2])
- ๋ฒกํฐ: [1, 0, 2]
- i=2 ๋, for ๋ฌธ ์ข ๋ฃ
- ํจ์ f(3,3,2) ๋ฐํ
24) ๋ณต๊ท: f(3, 3, 1)
- ๋ฐฉ๊ธ i=1 ์ฒ๋ฆฌ ์๋ฃ
- ์ญ๋ฐฉํฅ swap: swap(v[1], v[1])
- ๋ฒกํฐ: [1, 0, 2](๋ณํ ์์)
- ๋ค์ i=2
25) (์ ๋ฐฉํฅ swap, i=2, depth=1)
- ์คํ: swap(v[2], v[1])
- ๋ฒกํฐ: [1, 2, 0] (์ธ๋ฑ์ค 1,2 ๊ตํ)
- ์ฌ๊ท ํธ์ถ: f(3, 3, 2)
26) ํธ์ถ: f(3, 3, 2)
- depth = 2, ํ์ฌ v = [1, 2, 0]
- for(i = 2 ~ 2)
27) (์ ๋ฐฉํฅ swap, i=2)
- ์คํ: swap(v[2], v[2])
- ๋ฒกํฐ: [1, 2, 0](๋ณํ ์์)
- ์ฌ๊ท ํธ์ถ: f(3, 3, 3)
28) ํธ์ถ: f(3, 3, 3)
- ๊ธฐ์ ์กฐ๊ฑด ์ถฉ์กฑ → ์ถ๋ ฅ: [1, 2, 0]
- ์ฌ๊ท ๋ฐํ
29) ๋ณต๊ท: f(3, 3, 2)
- ์ญ๋ฐฉํฅ swap: swap(v[2], v[2])
- ๋ฒกํฐ: [1, 2, 0]
- for ๋ฌธ ์ข ๋ฃ
- ํจ์ f(3,3,2) ๋ฐํ
30) ๋ณต๊ท: f(3, 3, 1)
- ๋ฐฉ๊ธ i=2 ์ฒ๋ฆฌ ์๋ฃ
- ์ญ๋ฐฉํฅ swap: swap(v[2], v[1])
- ๋ฒกํฐ: [1, 0, 2]
- i=1,2 ๋ → for ๋ฌธ ์ข ๋ฃ
- ํจ์ f(3,3,1) ๋ฐํ
31) ๋ณต๊ท: f(3, 3, 0)
- ๋ฐฉ๊ธ i=1 ์ฒ๋ฆฌ ์๋ฃ
- ์ญ๋ฐฉํฅ swap: swap(v[1], v[0])
- ๋ฒกํฐ: [0, 1, 2]
- ๋ค์ i=2
32) (์ ๋ฐฉํฅ swap, i=2, depth=0)
- ์คํ: swap(v[2], v[0])
- ๋ฒกํฐ: [2, 1, 0]
- ์ฌ๊ท ํธ์ถ: f(3, 3, 1)
33) ํธ์ถ: f(3, 3, 1)
- depth = 1, ํ์ฌ v = [2, 1, 0]
- for(i = 1 ~ 2)
34) (์ ๋ฐฉํฅ swap, i=1)
- ์คํ: swap(v[1], v[1])
- ๋ฒกํฐ: [2, 1, 0](๋ณํ ์์)
- ์ฌ๊ท ํธ์ถ: f(3, 3, 2)
35) ํธ์ถ: f(3, 3, 2)
- depth = 2, v = [2, 1, 0]
- for(i = 2 ~ 2)
36) (์ ๋ฐฉํฅ swap, i=2)
- ์คํ: swap(v[2], v[2])
- ๋ฒกํฐ: [2, 1, 0](๋ณํ ์์)
- ์ฌ๊ท ํธ์ถ: f(3, 3, 3)
37) ํธ์ถ: f(3, 3, 3)
- ๊ธฐ์ ์กฐ๊ฑด ์ถฉ์กฑ → ์ถ๋ ฅ: [2, 1, 0]
- ์ฌ๊ท ๋ฐํ
38) ๋ณต๊ท: f(3, 3, 2)
- ์ญ๋ฐฉํฅ swap: swap(v[2], v[2])
- ๋ฒกํฐ: [2, 1, 0]
- i=2 ๋, for ๋ฌธ ์ข ๋ฃ
- ํจ์ f(3,3,2) ๋ฐํ
39) ๋ณต๊ท: f(3, 3, 1)
- ๋ฐฉ๊ธ i=1 ์ฒ๋ฆฌ ์๋ฃ
- ์ญ๋ฐฉํฅ swap: swap(v[1], v[1])
- ๋ฒกํฐ: [2, 1, 0](๋ณํ ์์)
- ๋ค์ i=2
40) (์ ๋ฐฉํฅ swap, i=2, depth=1)
- ์คํ: swap(v[2], v[1])
- ๋ฒกํฐ: [2, 0, 1]
- ์ฌ๊ท ํธ์ถ: f(3, 3, 2)
41) ํธ์ถ: f(3, 3, 2)
- depth = 2, ํ์ฌ v = [2, 0, 1]
- for(i = 2 ~ 2)
42) (์ ๋ฐฉํฅ swap, i=2)
- ์คํ: swap(v[2], v[2])
- ๋ฒกํฐ: [2, 0, 1]
- ์ฌ๊ท ํธ์ถ: f(3, 3, 3)
43) ํธ์ถ: f(3, 3, 3)
- ๊ธฐ์ ์กฐ๊ฑด ์ถฉ์กฑ → ์ถ๋ ฅ: [2, 0, 1]
- ์ฌ๊ท ๋ฐํ
44) ๋ณต๊ท: f(3, 3, 2)
- ์ญ๋ฐฉํฅ swap: swap(v[2], v[2])
- ๋ฒกํฐ: [2, 0, 1]
- i=2 ๋, for ๋ฌธ ์ข ๋ฃ
- ํจ์ f(3,3,2) ๋ฐํ
45) ๋ณต๊ท: f(3, 3, 1)
- ๋ฐฉ๊ธ i=2 ์ฒ๋ฆฌ ์๋ฃ
- ์ญ๋ฐฉํฅ swap: swap(v[2], v[1])
- ๋ฒกํฐ: [2, 1, 0]
- i=1,2 ๋, for ๋ฌธ ์ข ๋ฃ
- ํจ์ f(3,3,1) ๋ฐํ
46) ๋ณต๊ท: f(3, 3, 0)
- ๋ฐฉ๊ธ i=2 ์ฒ๋ฆฌ ์๋ฃ
- ์ญ๋ฐฉํฅ swap: swap(v[2], v[0])
- ๋ฒกํฐ: [0, 1, 2]
- ์ด์ i=0,1,2 ๋ชจ๋ ์ฒ๋ฆฌ → for ๋ฌธ ์ข ๋ฃ
- ํจ์ f(3,3,0) ์์ ์ข ๋ฃ
์ต์ข ์ถ๋ ฅ ์์
์ค๊ฐ์ ๊ธฐ์ ์กฐ๊ฑด์์ ์ถ๋ ฅ๋ ์์ด์ ์์๋๋ก ์ ์ด ๋ณด๋ฉด:
- [0, 1, 2]
- [0, 2, 1]
- [1, 0, 2]
- [1, 2, 0]
- [2, 1, 0]
- [2, 0, 1]
(์ด 6๊ฐ์ง, 3!3!๊ฐ)
์์ฝ
- ๊ฐ depth๋ง๋ค i = depth๋ถํฐ i < n๊น์ง ๋ฐ๋ณต์ ์ํํ๋ฉฐ, swap -> ์ฌ๊ท -> swap(์์๋ณต๊ตฌ) ํํ๋ก ์งํ๋๋ค.
- depth(๊น์ด) = r(์ ํํ ์์ ๊ฐ์) ์ ๋๋ฌํ๋ฉด ๊ธฐ์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ด ์์ด์ ์ถ๋ ฅํ๊ณ ์ฌ๊ท๋ฅผ ๋ฐํํ๋ค.
- ๋ฐํ ์์๋ ๋ฐ๋์ ์์๋ณต๊ตฌ๋ฅผ ํตํด ๋ฒกํฐ๊ฐ ์ด์ ์ํ๋ก ๋์๊ฐ์ผํ๋ค.
- ์ด๋ ๊ฒ ํด์ ๊ฐ์ ์์ด(6๊ฐ)์ด ๋ชจ๋ ์ถ๋ ฅ๋๊ณ , ์ต์ข 46๋ฒ์งธ ๋จ๊ณ์์ ์ด๊ธฐ ํธ์ถ f(3, 3, 0)์ ๋ฐ๋ณต๋ฌธ๋ ์ข ๋ฃ๋๋ฉด์ ๋ชจ๋ ์ฌ๊ท๊ฐ ๋ง๋ฌด๋ฆฌ๋๋ค.
๐ ์์ฉ : 3P2๋ฅผ ๋ฝ๊ณ ์ถ์ ๋ ์ด๋ป๊ฒ ํ์ง ?
์์ฃผ ๊ฐ๋จํ๊ฒ ์ถ๋ ฅ ์์ ๊ธธ์ด(r)๋งํผ๋ง ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ค. ํ์ง๋ง ์ด๊ฒ์ 3P2์ผ ๊ฒฝ์ฐ์ด๊ณ 5P2์ผ ๊ฒฝ์ฐ, ์ค๋ณต ์ถ๋ ฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํ๋๋ฐ ์ด๋ฌํ ๋ฌธ์ ๋ set ์๋ฃ๊ตฌ์กฐ๋ฅผ ํ์ฉํจ์ผ๋ก์จ ํด๊ฒฐํ ์ ์๋ค.