알고리즘 공부 및 문제 풀이/백준(BOJ)
[c++] 백준 15649 N과 M (1)
yoonjiy
2021. 7. 20. 21:52
백준 단계별로 풀어보기 [백트래킹] N과 M (1)
https://www.acmicpc.net/problem/15649
15649번: N과 M (1)
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해
www.acmicpc.net
[풀이]
dfs 완전 탐색 기법을 이용해서 풀 수 있는 백트래킹 문제이다. 1~n 까지의 자연수 중에서 길이가 m인 수열을 모두 구해 출력해야 하는데, visited[] bool 배열을 선언해 방문했는지 여부를 체크하고 방문하지 않았으면 list 배열에 해당 숫자를 저장한다. count가 m과 같아지면 m 길이의 수열을 만족하는 것이므로 출력을 해준다. 재귀를 이용한 dfs를 구현해 풀 수 있었다.
[코드]
#include <iostream>
#include <algorithm>
#define MAX 9
int n, m;
bool visited[MAX] = { false, };
int list[MAX];
void dfs(int count) {
if (count == m) {
for (int i = 0; i < m; i++) {
std::cout << list[i] << " ";
}
std::cout << "\n";
return;
}
for (int i = 1; i <= n; i++) {
if (!visited[i]) {
visited[i] = true;
list[count] = i;
dfs(count+1);
visited[i] = false;
}
}
}
int main() {
std::cin >> n >> m;
dfs(0);
return 0;
}