[0์ฃผ์ฐจ] ์์ด(permutation)๊ณผ ์กฐํฉ(combination) - ์กฐํฉํธ
๐ ์กฐํฉ์ด๋?
์์์ ๊ณ ๋ ค ์์ด ๋จ์ํ๊ฒ ์ ํ๋ง ํ๋ ๊ฒฝ์ฐ์ ์, n ๋ช ์ค์ r๋ช ์ ๋ฝ๊ธฐ๋ง ํ๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ์๋ฏธํ๋ค.
4C2๋ฅผ ๊ตฌํ๋ ๊ณต์์ ์์ด์ ๊ตฌํ๋ ๊ณต์๋ณด๋ค๋ ์กฐ๊ธ ์ด๋ ต๋ค. ์์ด๋ฌ๋ํ๊ฒ๋ ์กฐํฉ์ ๊ตฌํ๊ธฐ ์ํด์๋ ์์ด์ ๋จผ์ ๊ตฌํ ํ, ์ ๊ฑฐ์ํค๋ฉด ๋๋ค. (์ ์ง๋ฌ๋๊ณ ์ทจ์ํ๋ ๋ฐฉ์) ์ฆ 4C2 = 4P2/2! ์ด ๋๋ค.
๐ C++ ์ฌ๊ทํจ์์์์ ์กฐํฉ
C++ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ์์ด์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ์๊ฐ ์ค๋น๋์ด์์ง๋ง ์์ฝ๊ฒ๋ ์กฐํฉ์ ์ํ ๊ฒ์ ์ค๋น๋์ด ์์ง ์๋ค. ์์ด๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์กฐํฉ ๋ํ ์ฌ๊ท ํจ์๋ก ๊ตฌํํ ์ ์๊ณ , ์ค์ฒฉ for๋ฌธ์ ํตํด ๊ตฌํ๋ ๊ฐ๋ฅํ๋ค.
์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
1) ํธ์ถ: combi(0, 0, [])
- start = 0, depth = 0, result = []
- ๋ฐ๋ณต๋ฌธ: for (int i = 0; i < 5; i++)
- ์ฆ, i = 0,1,2,3,4 ์ํ
1-1) i = 0
- result.push_back(a[0]) → result = [1]
- ์ฌ๊ท ํธ์ถ: combi(0+1, 0+1, [1]) = combi(1, 1, [1])
2) ํธ์ถ: combi(1, 1, [1])
- start = 1, depth = 1, result = [1]
- ๋ฐ๋ณต๋ฌธ: for (int i = 1; i < 5; i++)
- ์ฆ, i = 1,2,3,4
2-1) i = 1
- result.push_back(a[1]) → result = [1, 2]
- ์ฌ๊ท ํธ์ถ: combi(2, 2, [1,2])
3) ํธ์ถ: combi(2, 2, [1,2])
- start = 2, depth = 2, result = [1,2]
- ๋ฐ๋ณต๋ฌธ: i = 2,3,4
3-1) i = 2
- result.push_back(a[2]) → result = [1,2,3]
- ์ฌ๊ท ํธ์ถ: combi(3, 3, [1,2,3])
4) ํธ์ถ: combi(3, 3, [1,2,3])
- depth = 3, k = 3 → ๊ธฐ์ ์กฐ๊ฑด ์ถฉ์กฑ
- ์ถ๋ ฅ: 1 2 3
- ๋ฐํ → ๋ณต๊ท
5) ๋ณต๊ท: combi(2, 2, [1,2,3])
- ๋์์์ result.pop_back() → result = [1,2]
- ๋ค์ i = 3๋ก ์งํ
3-2) i = 3
- result.push_back(a[3]) → result = [1,2,4]
- ์ฌ๊ท ํธ์ถ: combi(4, 3, [1,2,4])
6) ํธ์ถ: combi(4, 3, [1,2,4])
- depth = 3 → ๊ธฐ์ ์กฐ๊ฑด
- ์ถ๋ ฅ: 1 2 4
- ๋ฐํ
7) ๋ณต๊ท: combi(2,2, [1,2,4])
- result.pop_back() → result = [1,2]
- ๋ค์ i = 4
3-3) i = 4
- result.push_back(a[4]) → result = [1,2,5]
- ์ฌ๊ท ํธ์ถ: combi(5, 3, [1,2,5])
8) ํธ์ถ: combi(5, 3, [1,2,5])
- depth = 3 → ๊ธฐ์ ์กฐ๊ฑด
- ์ถ๋ ฅ: 1 2 5
- ๋ฐํ
9) ๋ณต๊ท: combi(2,2, [1,2,5])
- result.pop_back() → result = [1,2]
- ๋ฐ๋ณต๋ฌธ i=2,3,4 ๋
- ๋ฐํ
10) ๋ณต๊ท: combi(1,1,[1,2])
- result.pop_back() → result = [1]
- ๋ค์ i = 2
2-2) i = 2
- result.push_back(a[2]) → result = [1,3]
- ์ฌ๊ท ํธ์ถ: combi(3, 2, [1,3])
11) ํธ์ถ: combi(3,2,[1,3])
- start = 3, depth = 2, result = [1,3]
- ๋ฐ๋ณต๋ฌธ: i = 3,4
11-1) i = 3
- result.push_back(a[3]) → result = [1,3,4]
- ์ฌ๊ท ํธ์ถ: combi(4, 3, [1,3,4])
12) ํธ์ถ: combi(4,3,[1,3,4])
- depth = 3 → ๊ธฐ์ ์กฐ๊ฑด
- ์ถ๋ ฅ: 1 3 4
- ๋ฐํ
13) ๋ณต๊ท: combi(3,2,[1,3,4])
- result.pop_back() → [1,3]
- ๋ค์ i = 4
11-2) i = 4
- result.push_back(a[4]) → [1,3,5]
- ์ฌ๊ท ํธ์ถ: combi(5,3,[1,3,5])
14) ํธ์ถ: combi(5,3,[1,3,5])
- depth=3 → ๊ธฐ์ ์กฐ๊ฑด
- ์ถ๋ ฅ: 1 3 5
- ๋ฐํ
15) ๋ณต๊ท: combi(3,2,[1,3,5])
- result.pop_back() → [1,3]
- i=4 ๋
- ๋ฐํ
16) ๋ณต๊ท: combi(1,1,[1,3])
- result.pop_back() → [1]
- ๋ค์ i = 3
2-3) i = 3
- result.push_back(a[3]) → [1,4]
- ์ฌ๊ท ํธ์ถ: combi(4,2,[1,4])
17) ํธ์ถ: combi(4,2,[1,4])
- start=4, depth=2, result=[1,4]
- ๋ฐ๋ณต๋ฌธ: i=4
17-1) i=4
- result.push_back(a[4]) → [1,4,5]
- ์ฌ๊ท ํธ์ถ: combi(5,3,[1,4,5])
18) ํธ์ถ: combi(5,3,[1,4,5])
- depth=3 → ๊ธฐ์ ์กฐ๊ฑด
- ์ถ๋ ฅ: 1 4 5
- ๋ฐํ
19) ๋ณต๊ท: combi(4,2,[1,4,5])
- result.pop_back() → [1,4]
- i=4 ์ข ๋ฃ
- ๋ฐํ
20) ๋ณต๊ท: combi(1,1,[1,4])
- result.pop_back() → [1]
- ๋ค์ i = 4
2-4) i=4
- result.push_back(a[4]) → [1,5]
- ์ฌ๊ท ํธ์ถ: combi(5,2,[1,5])
21) ํธ์ถ: combi(5,2,[1,5])
- start=5, depth=2
- ๋ฐ๋ณต๋ฌธ: for (int i=5; i<5; i++) → ์คํ ์ ๋จ(i=5 >=5)
- ๋ฐํ
22) ๋ณต๊ท: combi(1,1,[1,5])
- result.pop_back() → [1]
- i=4 ๋
- ๋ฐํ
23) ๋ณต๊ท: combi(0,0,[1])
- result.pop_back() → []
- ๋ค์ i = 1
์ด์ i=1 (์ฌ๊ธฐ๋ ๋งจ ์ฒ์ combi(0,0,[])์ ๋ฐ๋ณต๋ฌธ)
1-2) i = 1
- result.push_back(a[1]) → [2]
- ์ฌ๊ท ํธ์ถ: combi(2,1,[2])
(์ดํ ํ๋ฆ์ ์์ ๋น์ทํ ํจํด์ผ๋ก ๋ฐ๋ณต)
๐ C++ ๋ฐ๋ณต๋ฌธ์์์ ์กฐํฉ
๋ฐ๋ณต๋ฌธ์์์ ์กฐํฉ์ ํจ์ฌ ๊ตฌํ์ด ๊ฐํธํ๋ค. 3๊ฐ ์ดํ์ ์์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์์๋ ๋ฐ๋ณต๋ฌธ์ผ๋ก ํ ๊ฒ์ ๊ถ์ ๋ฐ์๋ค. ์งํฉ์ ํฌ๊ธฐ๋ ์ ๊ณผ ๊ฐ์ด 5๊ฐ์ด๋ฉฐ ์กฐํฉํ๋ ค๋ ์์ ์ญ์ 3๊ฐ๋ก ์ ๊ณผ ๊ฐ๋ค.
์ฝ๋๋ฅผ ๋ณด๋ฉด ๋์ถฉ ๋์น ์ฑ๊ฒ ์ง๋ง ์ด์ฐจ์ ๋ฐฐ์ด, 3์ฐจ์ ๋ฐฐ์ด์ ์ถ๋ ฅํ๋ ํ์๊ณผ ๊ฐ๋ค. ๊ฐ์ ๋งฅ๋ฝ์ผ๋ก ๋ง์ฝ์ 2๊ฐ์ ์์๋ฅผ ์ถ๋ ฅํ๊ณ ์ถ๋ค๋ฉด
for๋ฌธ์ด ํจ์ฌ ๊ตฌํ ๋ฉด์์ ์ฝ์ง๋ง ์๋ ๋ฉด์์ ์์ฌ์์ด ์์ผ๋ ์ฌ๊ท ํจ์๋ ๊ผญ ์์ง ๋ง์.
๐ Pseudo Code
์กฐํฉ :
1) ๊ธฐ์ ์ฌ๋ก : ๊น์ด๊ฐ ์กฐํฉํ๋ ค๋ ์๊ฐ ๊ฐ๋ค๋ฉด -> if(depth == k)
2) ๋ฐฐ์ด์ ๊ธธ์ด ์์๋ถํฐ n ๋งํผ ๋ฐ๋ณต -> for( int i = start; i < n; i++)
2-1) result ๋ฐฐ์ด์ ์์ ์ถ๊ฐ -> result.push_back(a[i])
2-2) ์ฌ๊ทํจ์ ํธ์ถ -> combi( i + 1 , depth + 1 , result);
2-3) ์์ ๋ณต๊ท -> result.pop_back();