Algorithm
백준 15650번(N과M(2)) 파이썬
동그라미_ssu
2023. 2. 3. 16:06
https://www.acmicpc.net/problem/15650
15650번: N과 M (2)
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해
www.acmicpc.net
전에 풀었던 N과M(1)문제에 오름차순으로 만 된 정답을 출력하라는 조건만 추가됐다.
1번을 푼 사람들은 2번문제는 무리없이 풀었을거라 생각한다.
추가적인 설명은 생략하겠다.
import sys
input = sys.stdin.readline
n,m = map(int,input().split())
ans = []
visited = [False]*(n+1)
def dfs():
if len(ans) == m: # 조건처럼 리스트의 길이가 m이 되면 출력해준다
a = sorted(ans) # ans를 오름차순으로 정렬시킨 후 a에 저장
if ans == a: # 오름차순으로 정렬된 a와 ans가 같은 경우에만 출력해준다.
print(' '.join(map(str,ans)))
return
for i in range(1,n+1):
if visited[i] == True: # 방문했을경우 continue 해준다
continue
visited[i] = True # 미방문일경우 방문처리를 해준다
ans.append(i) # 그리고 리스트에 추가해준다
dfs() # 이어서 dfs문을 재귀함수로 실행한다
ans.pop() # 마지막에 추가됐던 수를 빼준다.
visited[i] = False # 여기가 중요!!!! 방문했던곳을 다시 미방문 처리 해준다
dfs()