문제풀이/백준

15654 - N과 M (5)

동바리 2023. 1. 23. 17:25

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

 

15654번: N과 M (5)

N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다. N개의 자연수 중에서 M개를 고른 수열

www.acmicpc.net

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int N, M;
vector<int> my_vector;
bool visited[10000 + 1];
int ans[10000 + 1];

void Run(const int start_idx, const int depth)
{
	if (visited[start_idx]) {
		return;
	}

	visited[start_idx] = true;
	ans[depth] = my_vector[start_idx];
	if (depth == M - 1) {
		for (int i = 0; i < M; i++) {
			cout << ans[i] << ' ';
		}

		cout << '\n';
		visited[start_idx] = false;
		return;
	}
	
	for (int i = 1; i < my_vector.size(); i++) {
		Run(i, depth + 1);
	}
	visited[start_idx] = false;
}

int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);

	cin >> N >> M;
	my_vector.resize(N + 1);
	for (int i = 1; i <= N; i++) {
		cin >> my_vector[i];
	}

	sort(my_vector.begin(), my_vector.end());

	if (M == 1) {
		for (int i = 1; i <= N; i++) {
			cout << my_vector[i] << '\n';
		}

		return 0;
	}

	for (int i = 1; i <= N; i++) {
		Run(i, 0);
	}
}
  1. 재귀함수를 이용하여 풀 수 있는 문제였습니다.
  2. 지금 코드의 경우는 main 함수에서 Run을 N번 실행합니다.
  3. 하지만 이런 방식 말고, main 함수에서 Run 함수를 한 번만 실행하고 Run 내에서 여러번 호출하는 방식으로 코딩을 고쳐봐야 할 것 같습니다.