Notice
Recent Posts
Recent Comments
Link
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

똥그래미 코딩공장

백준 15649번(N과M(1)) 파이썬 본문

Algorithm

백준 15649번(N과M(1)) 파이썬

동그라미_ssu 2023. 2. 1. 23:25

https://www.acmicpc.net/problem/15649

 

15649번: N과 M (1)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

이 문제는 백트래킹 문제이다. 백트래킹은 dfs에서 주로 응용되는 알고리즘이다.

방문 후에 다시 미방문 처리를 해주는 알고리즘 이다.

난이도 꽤 있는 알고리즘이라고 말 할 수 있다. 코딩테스트에도 자주 나오는 유형이니 꼭 짚고 넘어가야한다.

아래 코드에 주석을 달아 설명해 놓았다.

import sys
input = sys.stdin.readline

n,m = map(int,input().split())
ans = []
visited = [False]*(n+1)

def dfs():
    if len(ans) == m: # 조건처럼 리스트의 길이가 m이 되면 출력해준다
        print(' '.join(map(str,ans)))
        return
    for i in range(1,n+1):
        if visited[i]: # 방문했을경우 continue 해준다
            continue
        visited[i] = True # 미방문일경우 방문처리를 해준다
        ans.append(i) # 그리고 리스트에 추가해준다
        dfs() # 이어서 dfs문을 재귀함수로 실행한다
        ans.pop() # 마지막에 추가됐던 수를 빼준다.
        visited[i] = False # 여기가 중요!!!! 방문했던곳을 다시 미방문 처리 해준다
        
        
dfs()