알고리즘 문제 풀이

문제

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

 

15650번: N과 M (2)

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

www.acmicpc.net


풀이

DFS를 이용해야하지만 DFS 시작점 이하의 수는 출력하면 안되므로 백트래킹 기법을 이용해야한다


소스 코드

// 헤더파일
#include <iostream>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <map>
#include <cctype>
#include <set>
#include <string.h>

using namespace std;

int N, M;
int arr[9];
bool visited[9];

void DFS(int start, int check) {
	if (check == M) {
		for (int i = 0; i < M; i++) {
			cout << arr[i] << ' ';
		}
		cout << '\n';
		return;
	}

	for (int i = start; i <= N; i++) {
		if (!visited[i]) {
			visited[i] = true;
			arr[check] = i;
			DFS(i + 1, check + 1);
			visited[i] = false;
		}
	}
}

int main() { 
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> N >> M;
	DFS(1, 0);
}

'Programming Practice > BOJ' 카테고리의 다른 글

[BOJ] 백준 1932 정수 삼각형 (C++)  (0) 2022.04.24
[BOJ] 백준 2407 조합 (C++)  (0) 2022.04.21
[BOJ] 백준 1149 RGB거리 (C++)  (0) 2022.04.20
[BOJ] 백준 16236 아기상어 (C++)  (0) 2022.04.19
[BOJ] 백준 1029 곱셈 (C++)  (0) 2022.04.19

+ Recent posts