Algorithm/acmicpc.net
백트래킹 : 재귀를 활용한
winney916
2022. 1. 6. 09:44
728x90
15654번 N과 M (5) https://www.acmicpc.net/problem/15654
15654번: N과 M (5)
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다. N개의 자연수 중에서 M개를 고른 수열
www.acmicpc.net
음... 완전탐색을 위해서 for문을 중첩으로 돌려야 하는데
for 문을 중첩시키는 횟수를 입력받아서 능동적으로 변경해야 하는 상황이었다. 이ㅓㄱㄹ 어떻게 하나..?
했더니 답은 재귀였다.
즉, 입력값에 맞춰서 for문의 중첩횟수를 설정해줘야 하는 경우라면
재귀함수가 적합하다
import sys
N, M = map(int, input().split())
nums = sorted(list(map(int, sys.stdin.readline().split())))
output = []
visited = [False]*N
def solve(depth, N, M): # reculsive
# stop condition
if depth == M:
print(' '.join(map(str, output)))
return
for i in range(N):
if not visited[i]: # 방문기록 점검, 일종의 그래프 탐색
visited[i] = True
output.append(nums[i])
solve(depth+1, N, M)
output.pop()
visited[i] = False
solve(0, N, M)
일종의 그래프 탐색과도 같다. (깊이 우선?)
visited를 통해 방문한 숫자를 확인해준다 -> 중복을 허용하지 않는 순열이기 때문에
너무 명쾌한 풀이라서 행복했다.