728x90
재귀 함수에 백트래킹을 섞어서 풀어본 수열 출력 문제
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
checked = [False] * (n + 1)
result = []
def recur(depth):
# Stop
if depth == m:
print(*result)
return
# Main
for i in range(1, n + 1):
if not checked[i]:
# Tracking
checked[i] = True
result.append(i)
# Recursion
recur(depth + 1)
# Backtracking
checked[i] = False
result.pop()
recur(0)
트래킹 & 백트래킹 과정 상세 (n=m=3 가정)
- result = s, checked = v로 간단히 기록
'''
recur(0)
--> for i = 1, track: v = [T, F, F], s = [1]
recur(0 + 1)
--> for i = 1, skip
--> for i = 2, track: v = [T, T, F], s = [1, 2]
recur((0 + 1) + 1)
--> print(*s): 1 2 and return
--> for i = 2, backtrack: v = [T, F, F], s = [1]
--> for i = 3, track: v = [T, F, T], s = [1, 3]
recur((0 + 1) + 1)
--> print(*s): 1 3 and return
--> for i = 3, backtrack: v = [T, F, F], s = [1]
--> return (automatically. for loop is done.)
--> for i = 1, backtrack: v = [F, F, F], s = []
--> for i = 2, track: v = [F, T, F], s = [2]
recur(0 + 1)
--> for i = 1, track: v = [T, T, F], s = [2, 1]
recur((0 + 1) + 1)
--> print(*s): 2 1 and return
--> for i = 1, backtrack = [F, T, F], s = [2]
--> for i = 2, skip
--> for i = 3, track: v = [F, T, T], s = [2, 3]
recur((0 + 1) + 1)
--> print(*s): 2 3 and return
--> for i = 3, backtrack: v = [F, T, F], s = [2]
--> return (automatically. for loop is done.)
--> for i = 2, backtrack: v = [F, F, F], s = []
--> for i = 3, track: v = [F, F, T], s = [3]
recur(0 + 1)
--> for i = 1, track: v = [T, F, T], s = [3, 1]
recur((0 + 1) + 1)
--> print(*s): 3 1 and return
--> for i = 1, backtrack: v = [F, F, T], s = [3]
--> for i = 2, track: v = [F, T, T], s = [3, 2]
recur((0 + 1) + 1)
--> print(*s): 3 2 and return
--> for i = 2, backtrack: v = [F, F, T], s = [3]
--> for i = 3, skip
--> return (automatically. for loop is done.)
--> for i = 3, backtrack: v = [F, F, F], s = []
--> return (automatically. for loop is done.)
'''
728x90
'코딩 테스트' 카테고리의 다른 글
백준 1926: 그림 (0) | 2025.02.20 |
---|---|
백준 11047: 동전 0 (0) | 2025.02.18 |
백준 14503: 로봇 청소기 (2) | 2025.02.18 |