똥그래미 코딩공장
백준 15649번(N과M(1)) 파이썬 본문
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()'Algorithm' 카테고리의 다른 글
| 백준 15650번(N과M(2)) 파이썬 (0) | 2023.02.03 |
|---|---|
| 백준 1654번(랜선 자르기) 파이썬 (0) | 2023.02.02 |
| 백준 10816번(숫자 카드2) 파이썬(이분탐색) (0) | 2023.01.31 |
| 백준 4963번(섬의 개수) 파이썬 (0) | 2023.01.30 |
| 백준 2805번(나무 자르기) 파이썬 (0) | 2023.01.29 |