ํ๊ต์์ ์ ๊ณตํ๋ ์ฌ๋ฆ๋ฐฉํ ์ฝ๋ฉ ํ ์คํธ ๋๋น ์บ ํ withย ์ฝ๋ํธ๋ฆฌ | ์ฝ๋ฉํ ์คํธ ์ค๋น๋ฅผ ์ํ ์๊ณ ๋ฆฌ์ฆ ์ ์์ ์๋ก๋ ๋ฌธ์ ํ์ด ๋ฐ ๊ฐ์ ์ ๋ฆฌ ๋ด์ฉ์ ๋๋ค.
์ฌ๊ทํจ์๋ ์๊ธฐ ์์ ์ ์ง๊ฐ์ ์ ์ผ๋ก ํธ์ถํ๋ ํจ์๋ฅผ ์๋ฏธํ๋ค. ์ด๋ฅผ ์ฝ๊ฒ ์ด์ผ๊ธฐํ๋ฉด ์ด๋ค ํจ์ f์์ ๋์ผํจ ํจ์ f๋ฅผ ๋ค์ ์ด์ฉํ๋ ๊ฒฝ์ฐ์ด๋ค. "ํผ๋ณด๋์น ์์ด" ๋ฐ "1๋ถํฐ N๊น์ง ์์ฐ์์ ํฉ ๊ณ์ฐ" ์ ์ฌ๊ทํจ์๋ฅผ ํ์ฉํ๋ ๋ํ์ ์ธ ์์ด๋ค. ์ด ๋์ for๋ฌธ์ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ ๊ฒ ๋ณด๋จ ์ฌ๊ท๋ก ๊ตฌํ๊ฒ ๋๋ฉด ์ฝ๋๋ฅผ ๊น๋ํ๊ฒ ์งค ์ ์๋ค.
์ฌ๊ท ํจ์ ์ฌ์ฉ์ด ์ด๋ ต๋ค๋ฉด ์ฌ๊ทํธ๋ฆฌ๋ฅผ ๋จผ์ ๊ทธ๋ ค๋ณด์!
์ฌ๊ท๋ฅผ ์ฌ์ฉํ ๋๋ ๊ฐ์ฅ ๋จผ์ ํจ์์ ์ ์์ ํจ์๊ฐ ๋ฐ๋ ์ธ์์ ์๋ฏธ๋ฅผ ๋ช
ํํ๊ฒ ํด์ผํ๋ค. ๊ทธ ํ์ ์ฌ๊ท๋ฅผ ํตํด ํจ์๋ฅผ ๋ฐ๋ณตํด์ผ๋ง ์ค์๋ฅผ ๋ฐฉ์ง ํ ์ ์๋ค. ๋ ๋ฒ์งธ๋ก๋ ์ข
๋ฃ ์กฐ๊ฑด์ ์ง๊ทนํ ๋น์ฐํ ๊ฑธ๋ก ๋ฌ์ผ ํ๋๋ฐ ๊ทธ๋์ผ๋ง ์ธ์ ์ฌ๊ท๋ฅผ ๋น ์ ธ๋๊ฐ์ผ ํ๋์ง ํ ๋์ ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ง์ง๋ง์ผ๋ก๋ ์ฌ๊ทํจ์์์ ๋น ์ ธ๋๊ฐ ๋ค์ ๋์๊ฐ๋ ๊ฒฝ์ฐ์๋ ์๋ ์ํ(์ฌ๊ท ํจ์์ ๋ค์ด๊ฐ๊ธฐ ์ ์ํ)๋ก ๋ค์ ๋์๊ฐ์ผ ํ๋ค ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฌ๊ทํจ์ ์ดํ์ ์คํ๋๋ ์ฝ๋์ Side Effect
๋ฅผ ๋ถ๋ฌ์ผ์ผํฌ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฅผ ์ฝ๊ฒ ์ดํดํ๊ธฐ ์ํด์๋ ์ฌ๋ฌ ์ ํ์ง๋ฅผ ์ฐ์ํด์ ๊ณ ๋ฅผ ๋ ํ๋์ ์ ํ์ ํ ํ์๋ ๋ค์ ์ฒ์ ์ ํํ์ ๋์ ๋์ผํ ํ๊ฒฝ์ผ๋ก ๋์์์ผ๋ง ๋ค์ ์ ํ์ ์งํํ ๋ ๊ณต์ ํด์ง์ ๋ ์ฌ๋ฆฌ๋ฉด ๋๋ค.
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)
์ด๋ผ๋ ํจ์ ์์ฑ ์ ์ฃผ์์ผ๋ก ํจ์์ ์ ์๋ฅผ ๋จผ์ ๋ช
ํํ๊ฒ ํ๋ค.cur_num
์ ์ฆ๊ฐ์์ผ ๋ค์ ์๋ฆฌ ์์ ๊ฐ์ ๋ฃ์ด์ฃผ๊ธฐ ์ํด ์ฌ๊ท ํธ์ถappend
ํ ๋ค์ ์๋ ์ํ๋ก ๋์๊ฐ๊ธฐ ์ํด pop()
์ ์งํํ๋ค.๋จ์ํ 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)
append
๋ถํฉํ์ง ์๋ค๋ฉด continue
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๊ฐ๋ฅผ ๋ฝ์ ๋ง๋ค ์ ์๋ ๋ชจ๋ ์กฐํฉ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ถ๋ ฅํ๋ ์ฝ๋๋ก ๋ฐ๊ฟ๋๊ฐ ๊ฒ์ด๋ค.
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()
append
ํ์ฌ ์ถ๋ ฅ ์ ์ฌ์ฉ๋ ์ซ์๋ฅผ ๋ณด์ฌ์ค๋ค.apppend
์ ํจ #๊ธฐ์กด append, pop ์ ๊ฑฐ
find_combination(cur_num+1, cnt)
arr.append(cur_num)
find_combination(cur_num+1, cnt+1)
arr.pop()
#๊ธฐ์กด ์์๋ฅผ ๋ฐ๊ฟ
arr.append(cur_num)
find_combination(cur_num+1, cnt+1)
arr.pop()
find_combination(cur_num + 1, cnt)
์ดํด๊ฐ ์ ๋์ง ์์ ๊ฒฝ์ฐ ์์๋ฅผ ๋ฐ๊พธ๊ธฐ ์ ํ์ ์ฌ๊ท ํธ๋ฆฌ๋ฅผ ๊ทธ๋ ค๋ณด์!
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 ๋ฐฐ์ด์ ํ์๋กํ๋ค.