๋ฌธ์ ๋งํฌ
15654๋ฒ: N๊ณผ M(5)
๋ฌธ์ ์์ฝ
N๊ฐ์ ์๋ก ๋ค๋ฅธ ์ ์๊ฐ ์ฃผ์ด์ง๋ค. ์ด ๋ ์๋ก ๋ค๋ฅธ ์ ์๋ก ๊ธธ์ด๊ฐ M์ธ ์์ด์ ์ฌ์ ์์๋๋ก ์ถ๋ ฅํ์ธ์.
ํ์ด ์ค๋ช
์ด ๋ฌธ์ ๊ฐ ์กฐ๊ฑด ์๋์์ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํ๋ ๋ฐฑํธ๋ํน ์๊ณ ๋ฆฌ์ฆ ์ ํ์ธ ๊ฒ์ ๋ง๊ฒ, ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ด์ ์ฌ๊ท์ ์ผ๋ก ํ์ํ์ฌ ์ถ๋ ฅํ์๋ค. (DFS)
๋์ฑ์ด ์ฌ์ ์์๋๋ก ์ถ๋ ฅํ๋ ๊ฒ์ด์ด์ DFS ๋ฐฉ์์ผ๋ก ๊ฒฝ์ฐ๋ฅผ ํ์ํ๋ ๊ฒ์ด ์ ์ ํ๋ค.
N, M=map(int, input().split())
nums=list(map(int, input().split()))
nums=sorted(nums)
def dfs(nums_print, nums_left):
if len(nums_print)==M:
for i in range(M):
print(nums_print[i], end=" ")
print()
return
elif len(nums_print)<M:
for i in range(len(nums_left)):
dfs(nums_print+[nums_left[i]], nums_left[:i]+nums_left[i+1:])
for i in range(N):
dfs([nums[i]], nums[:i]+nums[i+1:])
์ฒ์ ๋ฌธ์ ๋ฅผ ํ๋ฉฐ ์ค์ํ๋ ๋ถ๋ถ์ remove ํจ์์ ์๋ชป๋ ์ฌ์ฉ์ด์๋ค.
dfs ํจ์๋ฅผ ๋ณด๋ฉด, ์ ์ฒด N๊ฐ์ ์ซ์ ์ค์์ ์ถ๋ ฅํ ๋ฆฌ์คํธ๋ก ์ ์ฅ๋๋ nums_print์ ๋จ์ ์ซ์๋ค์ธ nums_left๋ก ์ ๋ ฅ๊ฐ์ ์ฃผ๋๋ฐ, ๊ธฐ์กด์๋ ์๋์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํจ์๋ฅผ ์คํํ๋ค.
for num in nums:
dfs([num], nums.remove(num))
remove๋ ํด๋น num ๊ฐ์ ์ญ์ ํ list๋ฅผ ๋ฐํํ๋ ๊ฒ์ด ์๋๋ผ ํด๋น list์์ ์ง์ num ๊ฐ์ ์ญ์ ํ๊ธฐ ๋๋ฌธ์ ์๋ํ์ง ์์ nums ๊ฐ์ ๋ณ๊ฒฝ์ด ๊ณ์ ๋ฐ์ํ๋ฉด์, ์ํ์ง ์์ ๊ฒฐ๊ณผ๊ฐ์ด ์ถ๋ ฅ๋๊ณ ์์๋ค.
์ด๋ list slicing์ผ๋ก ํจ์์ ์ธ์๋ฅผ ์ ๋ ฅํจ์ผ๋ก์จ ํด๊ฒฐํ์๋ค.
๋๋ถ์ด ์ด์ฒ๋ผ ํ๋ก๊ทธ๋จ์ ํจ์๋ก ์ชผ๊ฐ์ด ๊ตฌํํ๋ ์ฝ๋ ์์ฑ ๋ฐฉ์์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๊ณ ํ๋๋ฐ, ์ด ๋ ๋ฐ์ดํฐ์ ๋ถ๋ณ์ฑ(Immutable)์ด ๋ฌด์์ด๊ณ ์ด๋ป๊ฒ ์งํฌ ์ ์๋์ง ์ดํดํ ์ ์์๋ค.
โป Python์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ผ ๋ถ๋ฆฌ์ง๋ง, ํจ์ํ ํ๋ก๊ทธ๋๋ฐ, ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ, ์ ์ฐจํ ํ๋ก๊ทธ๋๋ฐ์ด ๋ชจ๋ ์์ํ๊ฒ ๊ฐ๋ฅํ ๋ค์ค ํจ๋ฌ๋ค์ ์ธ์ด์ด๋ค.
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํ ๋, Immutable์ ์งํค๋ฉด ๋์ฑ ์ฝ๋ ์ง๊ธฐ๊ฐ ํธํด์ง๋ค.