15650번: N과 M (2)
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해
www.acmicpc.net
n, m = map(int,input().split())
is_used = [False]*(n+1)
temp = []
answer = []
def back(start):
if len(temp) == m:
answer.append(' '.join(map(str,temp)))
return
for i in range(start,n+1):
if i not in temp:
temp.append(i)
back(i+1)
temp.pop()
back(1)
for ans in answer:
print(ans)
이번 문제는 바로 이전에 풀이했던 15649번의 응용 문제이다.
[백준 15649번] N과 M(1)
15649번: N과 M (1) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하
woohyun-king.tistory.com
이 문제를 처음 풀이했을 때는 백트래킹을 사용하지 않고 집합으로 저장을 하여 중복된 경우를 정답(answer) 리스트에 넣지 않았는데, 이 문제의 의도는 이것이 아니었다.
이 문제에서 의도한 바는 '오름차순'으로 저장해야 한다는 것이므로 현재 수보다 낮은 수들은 사전에 방문하지 않는 방식으로 풀어야 한다. 따라서 start 라는 매개변수를 만들어서 반복문의 시작점으로 삼아 사전에 탐색하지 않도록 가지치기(pruning) 하였다.
'Algorithm > Backtracking' 카테고리의 다른 글
[백준 12100번] 2048(Easy) - 구현 / 시뮬레이션 / 완전탐색 / 백트래킹 (1) | 2023.10.07 |
---|---|
[백준 1469번] 숌 사이 수열 (0) | 2023.09.29 |
[백준 9663번] N-Queen (0) | 2023.09.12 |
[백준 15649번] N과 M(1) (0) | 2023.09.11 |
[Backtracking] 백트래킹 알고리즘의 정의 (0) | 2023.08.23 |