์žฌ๊ท€(Recursion) with Backtracking๐Ÿฅธ

โ€์„œ์ง€์˜คยท2022๋…„ 8์›” 8์ผ
0

์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ

๋ชฉ๋ก ๋ณด๊ธฐ
3/19
post-thumbnail

ํ•™๊ต์—์„œ ์ œ๊ณตํ•˜๋Š” ์—ฌ๋ฆ„๋ฐฉํ•™ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ๋Œ€๋น„ ์บ ํ”„ withย ์ฝ”๋“œํŠธ๋ฆฌ | ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ค€๋น„๋ฅผ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •์„์— ์ˆ˜๋ก๋œ ๋ฌธ์ œ ํ’€์ด ๋ฐ ๊ฐ•์˜ ์ •๋ฆฌ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.


์žฌ๊ท€(Recursion) in Coding Test

์žฌ๊ท€ํ•จ์ˆ˜๋Š” ์ž๊ธฐ ์ž์‹ ์„ ์ง๊ฐ„์ ‘์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ด๋ฅผ ์‰ฝ๊ฒŒ ์ด์•ผ๊ธฐํ•˜๋ฉด ์–ด๋–ค ํ•จ์ˆ˜ f์•ˆ์— ๋™์ผํ•จ ํ•จ์ˆ˜ f๋ฅผ ๋‹ค์‹œ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค. "ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด" ๋ฐ "1๋ถ€ํ„ฐ N๊นŒ์ง€ ์ž์—ฐ์ˆ˜์˜ ํ•ฉ ๊ณ„์‚ฐ" ์€ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์ด๋‹ค. ์ด ๋‘˜์„ for๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ•˜๋Š” ๊ฒƒ ๋ณด๋‹จ ์žฌ๊ท€๋กœ ๊ตฌํ•˜๊ฒŒ ๋˜๋ฉด ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์งค ์ˆ˜ ์žˆ๋‹ค.

์žฌ๊ท€ ํ•จ์ˆ˜ ์‚ฌ์šฉ์ด ์–ด๋ ต๋‹ค๋ฉด ์žฌ๊ท€ํŠธ๋ฆฌ๋ฅผ ๋จผ์ € ๊ทธ๋ ค๋ณด์ž!


์žฌ๊ท€ ํ•จ์ˆ˜ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ ์‚ฌํ•ญ

์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๊ฐ€์žฅ ๋จผ์ € ํ•จ์ˆ˜์˜ ์ •์˜์™€ ํ•จ์ˆ˜๊ฐ€ ๋ฐ›๋Š” ์ธ์ž์˜ ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ด์•ผํ•œ๋‹ค. ๊ทธ ํ›„์— ์žฌ๊ท€๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•ด์•ผ๋งŒ ์‹ค์ˆ˜๋ฅผ ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋กœ๋Š” ์ข…๋ฃŒ ์กฐ๊ฑด์„ ์ง€๊ทนํžˆ ๋‹น์—ฐํ•œ ๊ฑธ๋กœ ๋‘ฌ์•ผ ํ•˜๋Š”๋ฐ ๊ทธ๋ž˜์•ผ๋งŒ ์–ธ์ œ ์žฌ๊ท€๋ฅผ ๋น ์ ธ๋‚˜๊ฐ€์•ผ ํ•˜๋Š”์ง€ ํ•œ ๋ˆˆ์— ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ๋Š” ์žฌ๊ท€ํ•จ์ˆ˜์—์„œ ๋น ์ ธ๋‚˜๊ฐ€ ๋‹ค์‹œ ๋Œ์•„๊ฐ€๋Š” ๊ฒฝ์šฐ์—๋Š” ์›๋ž˜ ์ƒํƒœ(์žฌ๊ท€ ํ•จ์ˆ˜์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „ ์ƒํƒœ)๋กœ ๋‹ค์‹œ ๋Œ์•„๊ฐ€์•ผ ํ•œ๋‹ค ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์žฌ๊ท€ํ•จ์ˆ˜ ์ดํ›„์— ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ์— Side Effect๋ฅผ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์—ฌ๋Ÿฌ ์„ ํƒ์ง€๋ฅผ ์—ฐ์†ํ•ด์„œ ๊ณ ๋ฅผ ๋•Œ ํ•˜๋‚˜์˜ ์„ ํƒ์„ ํ•œ ํ›„์—๋Š” ๋‹ค์‹œ ์ฒ˜์Œ ์„ ํƒํ–ˆ์„ ๋•Œ์™€ ๋™์ผํ•œ ํ™˜๊ฒฝ์œผ๋กœ ๋Œ์•„์™€์•ผ๋งŒ ๋‹ค์Œ ์„ ํƒ์„ ์ง„ํ–‰ํ•  ๋•Œ ๊ณต์ •ํ•ด์ง์„ ๋– ์˜ฌ๋ฆฌ๋ฉด ๋œ๋‹ค.


์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ Backtracking

1. K๊ฐœ ์ค‘ ํ•˜๋‚˜๋ฅผ N๋ฒˆ ์„ ํƒํ•˜๊ธฐ

n์ด ์ฃผ์–ด์กŒ์„ ๊ฒฝ์šฐ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” n์ž๋ฆฌ์˜ ๋ชจ๋“  2์ง„์ˆ˜๋ฅผ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž. ๋งŒ์•ฝ n์ด 2์ธ๊ฒฝ์šฐ์—๋Š” 00, 01, 10, 11 ์ˆœ์„œ๋กœ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. ๋ฐ‘์— ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด ์ด ์ฒซ ๋ฒˆ์งธ ์ž๋ฆฌ ๋ถ€ํ„ฐ n๋ฒˆ ์งธ ์ž๋ฆฌ ๊นŒ์ง€ 0๋˜๋Š” 1 ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋Š” ํ–‰์œ„๋ฅผ n๋ฒˆ ๋ฐ˜๋ณตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ์ ‘๊ทผํ•ด๋ณด์ž

๋ฌธ์ œ

1์ด์ƒย K์ดํ•˜์˜ ์ˆซ์ž๋ฅผ ํ•˜๋‚˜ ๊ณ ๋ฅด๋Š” ํ–‰์œ„๋ฅผย N๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์„œ๋กœ ๋‹ค๋ฅธ ์ˆœ์„œ์Œ์„ ๊ตฌํ•ด์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ณด์„ธ์š”.

ํ’€์ด

k, n = map(int, input().split())
#k์ดํ•˜์˜ ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ n์ž๋ฆฌ์ˆ˜๊ฐ€ ๋˜๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜ 1๋ถ€ํ„ฐ ์ถœ๋ ฅ

arr = [] #์„ ํƒํ•œ ์ˆซ์ž๋ฅผ ๋‹ด์„ ๋ฆฌ์Šค
#cur_num : ํ˜„์žฌ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์ด ์•ž์—์„œ ๋ถ€ํ„ฐ ๋ช‡ ๋ฒˆ์งธ ์ž๋ฆฌ ์ˆ˜ ์ธ์ง€
def choose(cur_num):  #cur_num๋ฒˆ์งธ ์œ„์น˜์— k์ดํ•˜์˜ ์ˆซ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๋Š” ํ•จ์ˆ˜
    if cur_num == n+1: #cur_num์ด n๋ณด๋‹ค ํด ๊ฒฝ์šฐ ์ข…๋ฃŒ
        for elem in arr:
            print(elem, end=' ')
        print()
        return
    for i in range(1, k+1):
        arr.append(i)
        choose(cur_num+1) #์žฌ๊ท€ ํ˜ธ์ถœ
        arr.pop() #์›๋ž˜ ์ƒํƒœ๋กœ ๋‹ค์‹œ ๋Œ๋ ค์คŒ
        
    # for๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ(k๊ฐ€ 3์ผ ๊ฒฝ์šฐ ์˜ˆ)
    # arr.append(1)
    # solve(cur_num+1)
    # arr.pop()
    # 
    # arr.append(2)
    # solve(cur_num+1)
    # arr.pop()
    # 
    # arr.append(3)
    # solve(cur_num+1)
    # arr.pop()

    return
#cur_num 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ ์ธ์ž๋กœ 1์„ ๋„˜๊ฒจ
choose(1)
  • choose(cur_num)์ด๋ผ๋Š” ํ•จ์ˆ˜ ์ž‘์„ฑ ์‹œ ์ฃผ์„์œผ๋กœ ํ•จ์ˆ˜์˜ ์ •์˜๋ฅผ ๋จผ์ € ๋ช…ํ™•ํ•˜๊ฒŒ ํ•œ๋‹ค.
  • ์ถœ๋ ฅ ์–‘์‹์ด ์˜ค๋ฆ„ ์ฐจ์ˆœ์ด๋ฏ€๋กœ for๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์ž๋ฆฌ์— ์ž…๋ ฅํ•  ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
  • cur_num์„ ์ฆ๊ฐ€์‹œ์ผœ ๋‹ค์Œ ์ž๋ฆฌ ์ˆ˜์— ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ธฐ ์œ„ํ•ด ์žฌ๊ท€ ํ˜ธ์ถœ
  • append ํ›„ ๋‹ค์‹œ ์›๋ž˜ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐ€๊ธฐ ์œ„ํ•ด pop()์„ ์ง„ํ–‰ํ•œ๋‹ค.

2. ํŠน์ • ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•œ K๊ฐœ ์ค‘ ํ•˜๋‚˜๋ฅผ N๋ฒˆ ์„ ํƒํ•˜๊ธฐ(Conditional)

๋‹จ์ˆœํžˆ k๊ฐœ์ค‘ ํ•˜๋‚˜๋ฅผ n๋ฒˆ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์กฐ๊ฑด์ด ๋ถ™๋Š”๋‹ค๋ฉด(ex 1์€ ์—ฐ์†ํ•  ์ˆ˜ ์—†๋‹ค.) ์ข…๋ฃŒ ์กฐ๊ฑด์— ์žฌ๊ท€ ํ•จ์ˆ˜๊ฐ€ ๋„๋‹ฌ ํ–ˆ์„ ๋•Œ ์ฃผ์–ด์ง„ ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋„ ๋˜์ง€๋งŒ ์• ์ดˆ์— ์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ๊ฐ’์„ ์„ ํƒํ•  ๋•Œ ํ™•์ธํ•œ๋‹ค๋ฉด ์žฌ๊ท€ํŠธ๋ฆฌ์˜ ๊ฐ€์ง€(๊ฒฝ์šฐ์˜ ์ˆ˜)๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์–ด ํšจ์œจ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

๋ฌธ์ œ

1์ด์ƒย K์ดํ•˜์˜ ์ˆซ์ž๋ฅผ ํ•˜๋‚˜ ๊ณ ๋ฅด๋Š” ํ–‰์œ„๋ฅผย N๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์„œ๋กœ ๋‹ค๋ฅธ ์ˆœ์„œ์Œ์„ ๊ตฌํ•ด์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ณด์„ธ์š”. ๋‹จ, ์—ฐ์†ํ•˜์—ฌ ๊ฐ™์€ ์ˆซ์ž๊ฐ€ย 3๋ฒˆ ์ด์ƒ ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ๋Š” ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

ํ’€์ด

k, n = map(int, input().split())
#k์ดํ•˜์˜ ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ n์ž๋ฆฌ์ˆ˜๊ฐ€ ๋˜๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜ 1๋ถ€ํ„ฐ ์ถœ๋ ฅ

arr = []
#cur_num : ํ˜„์žฌ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์ด ์•ž์—์„œ ๋ถ€ํ„ฐ ๋ช‡ ๋ฒˆ์งธ ์ž๋ฆฌ ์ˆ˜ ์ธ์ง€
def choose(cur_num):  #cur_num๋ฒˆ์งธ ์œ„์น˜์— 1~k ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๋Š” ํ•จ์ˆ˜
    if cur_num == n+1:
        for elem in arr:
            print(elem, end=' ')
        print()
        return
    for i in range(1, k+1): 
        if cur_num >= 3 and arr[-2] == arr[-1] == i: #์•ž์„  ๋‘ ์ˆซ์ž์™€ ํ˜„์žฌ ์ถ”๊ฐ€ํ•  ๊ฐ’์ด ๊ฐ™์€์ง€ ํ™•์ธ
            continue #์—ฐ์†ํ•œ๋‹ค๋ฉด ์„ ํƒํ•˜์ง€ ์•Š๊ณ  return
        arr.append(i)
        choose(cur_num+1) #์žฌ๊ท€ ํ˜ธ์ถœ
        arr.pop() #์›๋ž˜ ์ƒํƒœ๋กœ ๋‹ค์‹œ ๋Œ๋ ค์คŒ

#cur_num 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ ์ธ์ž๋กœ 1์„ ๋„˜๊ฒจ
choose(1)
  • ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ธฐ ์ „ ์ฃผ์–ด์ง„ ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š”์ง€ ๋จผ์ € if๋ฌธ์œผ๋กœ ํ™•์ธ ํ›„ ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋‹ค๋ฉด append ๋ถ€ํ•ฉํ•˜์ง€ ์•Š๋‹ค๋ฉด continue
  • ์•ž์„œ ์ด์•ผ๊ธฐ ํ–ˆ๋“ฏ์ด ์ถœ๋ ฅํ•  ๋•Œ๊ฐ€ ์•„๋‹Œ ๊ฐ’์„ ์„ ํƒํ•  ๋•Œ ์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ํ™•์ธํ•œ๋‹ค.

3. N๊ฐœ์ค‘์— M๊ฐœ ๊ณ ๋ฅด๊ธฐ == ์กฐํ•ฉ(Combination)

1๋ฒˆ ์˜ˆ์ œ(k์ค‘ ํ•˜๋‚˜๋ฅผ n๋ฒˆ ์„ ํƒํ•˜๊ธฐ)์—์„œ n์ž๋ฆฌ ์ด์ง„์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์•˜๋Š”๋ฐ ์—ฌ๊ธฐ์— n์ž๋ฆฌ ์ด์ง„ ์ˆ˜ ์ค‘ 1์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ •ํ™•ํžˆ m๊ฐœ์ธ ๊ฒฝ์šฐ๋งŒ ์ถœ๋ ฅํ•˜๋ผ๋Š” ์กฐ๊ฑด์ด ๋ถ™๋Š”๋‹ค๋ฉด ๋ฐ‘์— ์ด๋ฏธ์ง€์™€ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

์œ„ ์ด๋ฏธ์ง€ ์† ์ฒซ ๋ฒˆ์งธ ์นธ์—๋Š” 1, ๋‘ ๋ฒˆ์งธ ์นธ์—๋Š” 2์™€ ๊ฐ™์ด ๋„ค๋ชจ ์นธ ๋งˆ๋‹ค 1๋ถ€ํ„ฐ k๊ฐ€ ํ• ๋‹น๋˜์–ด ์žˆ๊ณ  ์นธ์˜ ๊ฐ’์ด 0์ด๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ, ๊ฐ’์ด 1์ด๋ฉด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด ์ด๋Š” k๊ฐœ์˜ ์ˆซ์ž ์ค‘ n๊ฐœ๋ฅผ ๋ฝ‘๋Š” kCn ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฆฌ์ŠคํŠธ์˜ ์ธ๋ฑ์Šค์— 1~k๊ฐ€ ํ• ๋‹น๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์ธ๋ฑ์Šค์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ด 1์ด๋ฉด ์‚ฌ์šฉ, 0์ด๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ด๊ฐ€ ํŽธํ•˜๋‹ค.

n, m = map(int, input().split())

arr = []
#cur_num : ํ˜„์žฌ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์ด ์•ž์—์„œ ๋ถ€ํ„ฐ ๋ช‡ ๋ฒˆ์งธ ์ž๋ฆฌ ์ˆ˜ ์ธ์ง€
#cnt : ํ˜„์žฌ๊นŒ์ง€ ๋‚˜์˜จ 1์˜ ๊ฐœ์ˆ˜
def find_combination(cur_num, cnt):  #cur_num๋ฒˆ์งธ ์œ„์น˜์— 0๋˜๋Š” 1์„ ๋„ฃ์–ด์ค€๋‹ค.
    if cur_num == n+1:
        if cnt == m:
            for elem in arr:
                print(elem, end=' ')
            print()
        return
    
    #=================์ด ๋ถ€๋ถ„์ด ๋‹จ๊ณ„๋ณ„๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค=================#
    arr.append(0)
    find_combination(cur_num+1, cnt) #0์„ ์„ ํƒํ–ˆ์„ ๊ฒฝ์šฐ cnt ์œ ์ง€
    arr.pop()

    arr.append(1)
    find_combination(cur_num+1, cnt+1) #1์„ ์„ ํƒํ–ˆ์„ ๊ฒฝ์šฐ cnt ์ฆ๊ฐ€
    arr.pop()
    #==========================================================#

#์ฒซ ๋ฒˆ์งธ ์ž๋ฆฌ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ณ  ๋‚˜์˜จ 1์˜ ๊ฐœ์ˆ˜๊ฐ€ 0๋ถ€ํ„ฐ ์‹œ์ž‘
find_combination(1, 0)

์œ„ ์ฝ”๋“œ๋Š” ์•ž์„œ ์–˜๊ธฐํ•œ n์ž๋ฆฌ์˜ ์ด์ง„ ์ˆ˜ ์ค‘ 1์˜ ๊ฐœ์ˆ˜๊ฐ€ m๊ฐœ์ธ ๊ฒฝ์šฐ๋งŒ ์ถœ๋ ฅํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ์ฝ”๋“œ์—์„œ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋ช‡ ๊ฐ€์ง€ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ n๊ฐœ์˜ ์ˆซ์ž ์ค‘ M๊ฐœ๋ฅผ ๋ฝ‘์•„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์กฐํ•ฉ์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•˜๋Š” ์ฝ”๋“œ๋กœ ๋ฐ”๊ฟ”๋‚˜๊ฐˆ ๊ฒƒ์ด๋‹ค.

1. 1์„ ์„ ํƒํ–ˆ์„ ๊ฒฝ์šฐ 1์„ cur_num์„ arr์— ์ถ”๊ฐ€

    arr.append(0)
    find_combination(cur_num+1, cnt)
    arr.pop()

    arr.append(cur_num) #์ด ๋ถ€๋ถ„์ด 1์—์„œ cur num์œผ๋กœ ๋ณ€๊ฒฝ
    find_combination(cur_num+1, cnt+1)
    arr.pop()
  • ์ฒซ ๋ฒˆ์งธ ์นธ(์ž๋ฆฌ) ๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ์นธ ๊นŒ์ง€ 1์—์„œ N๊นŒ์ง€์˜ ์ˆซ์ž๊ฐ€ ํ• ๋‹น๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด cur_num์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒŒ ๊ณง ์ž๋ฆฌ์— ํ•ด๋‹น๋œ ์ˆซ์ž์™€ ๊ฐ™๋‹ค.
  • ๋‹จ์ˆœํžˆ 1์ด ์•„๋‹Œ, ์ž๋ฆฌ์— ํ• ๋‹น๋œ ์ˆซ์ž๋ฅผ arr์— appendํ•˜์—ฌ ์ถœ๋ ฅ ์‹œ ์‚ฌ์šฉ๋œ ์ˆซ์ž๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

2. 0์„ ์„ ํƒํ–ˆ์„ ๊ฒฝ์šฐ, ์ฆ‰ ํ•ด๋‹น ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ apppend ์•ˆ ํ•จ

    #๊ธฐ์กด append, pop ์ œ๊ฑฐ
    find_combination(cur_num+1, cnt)


    arr.append(cur_num)
    find_combination(cur_num+1, cnt+1)
    arr.pop()
  • ๊ธฐ์กด์—๋Š” ์„ ํƒ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์— 0์ด arr์— ๋“ค์–ด๊ฐ”๋Š”๋ฐ 0์„ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ถœ๋ ฅ ์‹œ ์„ ํƒ๋œ ์ˆซ์ž๋งŒ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค.

3. ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์ฒ˜์Œ์— 0์ด ์•„๋‹Œ 1์„ ์„ ํƒ

    #๊ธฐ์กด ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟˆ
    arr.append(cur_num)
    find_combination(cur_num+1, cnt+1)
    arr.pop()

    find_combination(cur_num + 1, cnt)
  • ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด 1์„ ์„ ํƒํ•˜๋Š” ๊ฒฝ์šฐ, ์ฆ‰ ํ•ด๋‹น ์ž๋ฆฌ์ˆ˜์— ํ• ๋‹น๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋จผ์ € ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ดํ•ด๊ฐ€ ์ž˜ ๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๊ธฐ ์ „ ํ›„์˜ ์žฌ๊ท€ ํŠธ๋ฆฌ๋ฅผ ๊ทธ๋ ค๋ณด์ž!

์ˆœ์—ด ๋งŒ๋“ค๊ธฐ

n์ด ์ฃผ์–ด์กŒ์„ ๋•Œ 1๋ถ€ํ„ฐ n๊นŒ์ง€์˜ ์ˆ˜๋“ค์„ ์ด์šฉํ•ด ์ค‘๋ณต ์—†์ด ๋ชจ๋“  ์ˆ˜๋“ค์ด ๋‚˜์˜ค๋Š” ์ˆœ์—ด์„ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด์ž. ๋ฐฉ๋ฒ•์€ ๋ฐ‘์— ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด ์ฒซ ๋ฒˆ์งธ ์ž๋ฆฌ ๋ถ€ํ„ฐ 1~n๊นŒ์ง€์˜ ์ˆซ์ž๋ฅผ ๋„ฃ์–ด์ฃผ๋Š”๋ฐ ์•ž์„œ ์„ ํƒํ•œ ์ˆซ์ž๋Š” ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์ˆซ์ž ์ค‘์—์„œ ์„ ํƒํ•œ๋‹ค.

์ด๋Š” ๊ธฐ์กด n์ž๋ฆฌ์˜ ์ด์ง„์ˆ˜์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์— ํŠน์ • ์กฐ๊ฑด์„ ๋ถ€์—ฌํ•œ ๊ฒƒ์ด๋‹ค.

๋ฌธ์ œ

1๋ถ€ํ„ฐ n๊นŒ์ง€์˜ ์ˆ˜๋ฅผ ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ์”ฉ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ˆ˜์—ด์„ ๊ตฌํ•ด์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ณด์„ธ์š”. ๋‹จ, ์‚ฌ์ „์ˆœ์œผ๋กœ ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ์ˆ˜์—ด๋ถ€ํ„ฐ ๋จผ์ € ์ถœ๋ ฅํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

ํ’€์ด

n = int(input())
arr = []
visited = [0 for _ in range(11)] #์„ ํƒ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด ์„ ์–ธ


def solve(cur_num): #1~n๊นŒ์ง€์˜ ์ˆซ์ž ์ค‘ ์•ž์—์„œ ์„ ํƒ๋˜์ง€ ์•Š์€ ์ˆ˜๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ํ•จ
    if cur_num == n+1:
        for elem in arr:
            print(elem, end=' ')
        print()
        return
    for i in range(1, n+1):
        if visited[i] == 1: #ํ˜„์žฌ ์„ ํƒํ•˜๋ ค๋Š” ์ˆซ์ž๊ฐ€ ์ด๋ฏธ ์„ ํƒํ–ˆ๋˜ ์ˆซ์ž๋ผ๋ฉด continue
            continue
        else:
            visited[i] = 1
            arr.append(i)
            solve(cur_num+1)
            arr.pop()
            visited[i] = 0

solve(1)
  • ์•ž์„œ ์„ ํƒํ–ˆ๋˜ ๊ฑด์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด visited ๋ฐฐ์—ด ์‚ฌ์šฉ
  • ์žฌ๊ท€์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „ visited ๊ฐ’์„ 1๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ  ์žฌ๊ท€์—์„œ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ ๋‹ค์‹œ visited ๊ฐ’์„ 0์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

์กฐํ•ฉ์— ๊ฒฝ์šฐ ํ˜„์žฌ ๊ฐ’์„ ๊ณ ๋ฅผ ๋•Œ ์ด์ „ ๊ฐ’์ด ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์ง€๋งŒ ์ˆœ์—ด์˜ ๊ฒฝ์šฐ๋Š” ํ˜„์žฌ ๊ฐ’์„ ๊ณ ๋ฅผ ๋•Œ ์ด์ „ ๊ฐ’์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์กฐํ•ฉ์—์„œ๋Š” ์• ์ดˆ์— ๊ฐ’์ด ์ˆœ์„œ๋Œ€๋กœ ๋“ฑ์žฅํ•˜์—ฌ ์ฒดํฌํ–ˆ๋˜ ๊ฑธ ๋‹ค์‹œ ์ฒดํฌํ•  ์ผ์ด ์—†๋Š” ๋ฐ˜๋ฉด ์ˆœ์—ด์˜ ๊ฒฝ์šฐ ๊ฐ’์ด ๋’ค์ฃฝ๋ฐ•์ฃฝ์œผ๋กœ ๋“ฑ์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— visited ๋ฐฐ์—ด์„ ํ•„์š”๋กœํ•œ๋‹ค.

profile
๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ฅผ ๊ฟˆ๊พธ๋Š” ํ•™์ƒ์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด