https://www.acmicpc.net/problem/15650
재귀를 이용해서 풀었다.
nums
는 길이 m인 수열을 저장하는 역할을 한다.nums
의 0번째 값은 수열을 첫번째 값이 된다.nums
에는 0번째부터 m-1번째까지 증가하는 형태로 저장되면 된다.l
이 m
이면 종료된다.l
은 재귀호출의 깊이이자 nums
의 인덱스가 된다.nums
배열을 모두 채웠다면 증가하는 한 개 수열을 완성한 것이므로 nums
의 수를 차례대로 출력하고 재귀호출을 종료한다. n, m = map(int, input().split())
def solve(nums, l):
if l == m:
for num in nums:
print(num, end=' ')
print()
return
for i in range(1, n+1):
# l이 0보다 큰 경우는 수열의 첫번째 값이 아니라는 의미
# 수열의 첫번째가 아니라면 이전값보다 큰 지 비교해야 한다.
if l > 0:
if i > nums[l-1]:
nums[l] = i
solve(nums, l+1)
# l이 0인 경우 수열의 첫번째 값이므로 무조건 값을 넣는다.
else:
nums[l] = i
solve(nums, l + 1)
nums = [0] * m
solve(nums, 0)
문제를 다 풀고 알고리즘 분류를 보니 백트래킹이다..
한 번만에 슥 풀리고 정답을 받아서 고치기 싫다. ㅎ