์•Œ๊ณ ๋ฆฌ์ฆ˜

[0์ฃผ์ฐจ] ์ˆœ์—ด(permutation)๊ณผ ์กฐํ•ฉ(combination) - ์กฐํ•ฉํŽธ

499.token.required 2025. 1. 14. 01:20

๐Ÿ“Œ  ์กฐํ•ฉ์ด๋ž€?

 

์ˆœ์„œ์˜ ๊ณ ๋ ค ์—†์ด ๋‹จ์ˆœํ•˜๊ฒŒ ์„ ํƒ๋งŒ ํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜, 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();