본문 바로가기
📊알고리즘/BOJ

[백트래킹 #1] BOJ 15649 - N과 M (1)

by meteorfish 2024. 2. 23.
728x90

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

 

15649번: N과 M (1)

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

www.acmicpc.net

 

접근 방법

예전에 풀어봤던 백트래킹이 가물가물해져서 다시 N과 M 시리즈를 풀어보도록 해야겠다.

 

브루트포스에서 처음부터 시작하는 것 대신, 이전 단계로 복귀하여 행하는 것이다.

코드를 보면 쉽게 이해가 가능하다.

 

https://www.youtube.com/watch?v=Enz2csssTCs

코드

#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>
#include <string>
#include <cmath>

#define MAX 9

using namespace std;


int n, m;
int v[MAX];
bool used[MAX];

void print() {
	for (int i = 0; i < m; i++) {
		cout << v[i] << ' ';
	}
	cout << '\n';
}

// k : 현재 갯수
void backTracking(int k) {
	if (k == m) {
		// 출력
		print();
		return;
	}
	for (int i = 1; i <= n; i++) {
		if (!used[i]) {
			v[k] = i;
			used[i] = true;
			backTracking(k + 1);
			used[i] = false;
		}
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin >> n >> m;
	backTracking(0);
}

 

 

728x90