๋ฌธ์
https://www.acmicpc.net/problem/15663
๋ฐฑ์ค ๋ฌธ์ ์ง - 0x0C๊ฐ - ๋ฐฑํธ๋ํน
์๊ณ ๋ฆฌ์ฆ: ๋ฐฑํธ๋ํน
ํ์ด
- N๊ฐ์ ์์ฐ์ ์ค์์ M๊ฐ๋ฅผ ๊ณ ๋ฅธ ์์ด
ํ ์ค์ ํ๋์ฉ ๋ฌธ์ ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์ด์ ์ถ๋ ฅํ๋ค. ์ค๋ณต๋๋ ์์ด์ ์ฌ๋ฌ ๋ฒ ์ถ๋ ฅํ๋ฉด ์๋๋ฉฐ, ๊ฐ ์์ด์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํด์ ์ถ๋ ฅํด์ผ ํ๋ค.
์์ด์ ์ฌ์ ์์ผ๋ก ์ฆ๊ฐํ๋ ์์๋ก ์ถ๋ ฅํด์ผ ํ๋ค.
ํ ์ซ์๋ฅผ ์ค๋ณต์ ํํ ์ ์์ผ๋ ๊ฐ์ ์ซ์๊ฐ ์ฌ๋ฌ๊ฐ ์ฃผ์ด์ง์๋ ์๋ค.
์๋ฅผ๋ค์ด [1, 2, 4, 4]์ผ๋, ์ธ๋ฒ์งธ์ 4์ ๋ค๋ฒ์งธ์ 4๋ ๋ค๋ฅธ 4๋ค.
๋จ, ์์ฑ๋ ์์ด์ ์ค๋ณต๋์ด์ ์๋๋ค.
์ฌ์ค ๋ชจ๋ ์ซ์๊ฐ ์ต๋ ํ๋์ฉ๋ง ์ฃผ์ด์ง๋ค๋ฉด 15654: N๊ณผ M (5) ๋ฌธ์ ์ ๋์ผํ๋ค.
ํ์ง๋ง ์ด๋ฒ ๋ฌธ์ ๋ if nums[i] in ret๊ณผ ๊ฐ์ด ์์ฑํ๊ฒ ๋๋ฉด [1, 2, 4, 4]์ฒ๋ผ '๊ฐ์ ์ซ์๊ฐ ์ฌ๋ฌ๊ฐ ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ'๋ฅผ ํ๋ณํ ์ ์๋ค.
๋ฐ๋ผ์ ์ซ์ ์ฌ์ฉ์ฌ๋ถ๋ฅผ ์ ์ฅํ ๋ฆฌ์คํธ, ์ด์ ์ ์ฌ์ฉํ ์ซ์๋ฅผ ์ ์ฅํ ๋ณ์๋ฅผ ์์ฑํด์ค์ผํ๋ค.
์ ์ฒด ์ฝ๋
# ๋ฉ๋ชจ๋ฆฌ: 31120KB / ์๊ฐ: 68ms
from sys import stdin
input = stdin.readline
N, M = map(int, input().split())
nums = sorted(map(int, input().split()))
used = [False] * N
ret = []
def backtrack(ret):
if len(ret) == M:
print(" ".join(map(str, ret)))
return
curr = 0
for i in range(N):
# i๋ฒ์งธ ์ซ์๋ฅผ ์ฌ์ฉํ์ง ์์๊ณ ์ด์ ์ซ์์ ๋ค๋ฅธ๊ฐ์ด๋ผ๋ฉด
if not used[i] and curr != nums[i]:
used[i] = True
ret.append(nums[i])
curr = nums[i]
backtrack(ret)
ret.pop()
used[i] = False
backtrack([])
๐ ์๋๋ ์ข ๋ ์์ธํ ๊ณผ์ ์ด
์๊น์ ์์์ ๊ฐ์ด [1, 2, 4, 4]๊ฐ ์ฃผ์ด์ก๊ณ , 1์ด๋ 2๋ก ์์ํ๋ ์์ด์ ๋ง๋ค์ด๋ ์ํ๋ผ๊ณ ๊ฐ์ ํด๋ณด์.
(N, M์ ๊ฐ๊ฐ 4, 2๋ก ๊ฐ์ )
# i๊ฐ 2์ผ๋
curr = nums[1] = 2
used = [False, False, False, False]
if not used[2] and curr != nums[i]:
used[2] = True
ret.append(nums[2])
curr = nums[2]
backtrack(ret)
# ํ์ฌ๊น์ง์ ๊ฒฐ๊ณผ
ret = [2]
used = [False, False, True, False]
curr = 4
# backtrack(ret) ์์
curr = 0 ์ผ๋ก ์ด๊ธฐํ
# i = 0
used[0] = False, curr != nums[0] ์ด๋ฏ๋ก ret = [4, 1] => print ํ pop(), curr์ nums[0]
# i = 1
used[1] = False, curr != nums[1] ์ด๋ฏ๋ก ret = [4, 2] => print ํ pop(), curr์ nums[1]
# i = 2
used[2] = True ์ด๋ฏ๋ก continue, curr์ ๋ณ๊ฒฝ์์ด nums[1]
# i = 3
used[3] = False, curr != nums[3] ์ด๋ฏ๋ก ret = [4, 4] => print ํ pop(), ์ํ๊ฐ ๋๋ฌ์ผ๋ฏ๋ก ๋งจ ์ฒ์ i = 2๋ก return
๋ค์ i = 2๋ก ๋์์์ backtrack(ret)์ด ๋๋ฌ์ผ๋ฏ๋ก pop(),
ret = [], curr = nums[2]
# i๊ฐ 3์ผ๋
used[3] = False ์ด์ง๋ง curr == nums[3]์ด๋ฏ๋ก continue, ์ํ๊ฐ ๋๋ฌ์ผ๋ฏ๋ก ๋ชจ๋ backtrack ํจ์ ์คํ ์ข
๋ฃ