[ ALGORITHM ]/[ 백 준 ]

[BAEKJOON] 15649번 N과 M (1)

HiStar__ 2020. 6. 13. 18:18

 

문 제

 

소 스  코 드

#include<iostream>

void Func(int , const int& , const int& , int *, bool *);
int main() {
	int N, M;
	while (1) {
		std::cin >> N >> M;

		if (M >= 1 && M <= N) {
			if (N >= M && N <= 8) break;
		}
	}

	int *temp	{ new int[M] };
	bool *tf	{ new bool[N] };

	for (int i = 0; i < N; ++i) tf[i] = false;

	Func(0, N, M, temp, tf);

	delete[] tf;
	delete[] temp;

	return 0;
}

void Func(int seq, const int& n, const int& m, int* temp, bool* tf) {
	if (m == seq) {
		for (int i = 0; i < m; ++i) std::cout << temp[i] << " ";
		std::cout << "\n";
		return;
	}
	
	for (int i = 0; i < n; ++i) {
		if (false == tf[i]) {
			tf[i] = true;

			temp[seq] = i + 1;
			Func(seq + 1, n, m, temp, tf);

			tf[i] = false;
		}
	}
}

풀 이

백트래킹 : 재귀 호출을 사용하면 간단하게 구현이 가능하다. 재귀 호출이 너무 많이 반복 하면 메모리 부족으로 강제 종료 될 수 있다.

 

std::endl / '\n' 의 차이점 : endl의 경우 출력 버퍼를 지워야 하기 때문에 시간이 오래 걸린다고 한다.

 

 

결 과 값

문 제 출 처

문제 링크 : [ BAEKJOON ] https://www.acmicpc.net/problem/15649