[Python]알고리즘/백준

[DFS/BFS/완전탐색] 15650번 - N과 M(2)(DFS, 백트래킹)

HSY_mumu 2022. 4. 13. 23:40
728x90

[백준] 15650번 - N과 M(2)

풀이 시간: 10분 이내

 

1) 문제 해결 아이디어

1부터 N까지의 자연수 중에서 중복 없이 M개를 고른 수열을 모두 구하는 문제로 전형적인 백트래킹 문제다.  아래의 조건 2개로부터 이 문제는 조합을  구하는 문제임을 알 수 있다.

  • 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
  • 고른 수열은 오름차순이어야 한다.

너무 기본 문제라 쉽게 풀 수 있었다. DFS를 이용하거나 combinations 라이브러리를 이용하는 방식 2가지가 있지만 이 문제는 조합을 구현하는 것이 키포인트이기 때문에 DFS를 이용한 풀이만 할 것이다.

 

조합을 구할 때는 이전에 선택한 값보다 큰 값을 골라서는 안되므로 dfs 인자로 깊이(depth)에 탐색시작값(idx)를 추가로 넘겨주어야 한다!!

이전 선택 여부를 확인하지 않아도 된다!!

 

2) 소스코드

n, m = map(int, input().split())   
temp = []  # 수열을 담을 곳
 
# DFS(깊이, 탐색시작값)
def dfs(depth, idx):
  # 길이가 m이 되었다면
  if depth == m:
    print(*temp)
    return
  # 1 ~ n 중에서 1개 뽑기
  for i in range(idx, n + 1):
    temp.append(i)
    dfs(depth + 1, i + 1)  # 깊이와 탐색시작값을 1씩 증가하여 넘겨줌
    temp.pop()
dfs(0, 1)
728x90