[BOJ] 15654번_N과 M (5)_백트래킹 (C++)

ChangBeom·2024년 10월 20일

Algorithm

목록 보기
92/97

[문제]

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

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

  • N개의 자연수 중에서 M개를 고른 수열

[사용 알고리즘]

백트래킹

[풀이 핵심]

  • N과 M (1)에서 조금 업그레이드 된 문제이다. 쉽게 말하면 주어진 N개의 자연수로 순열을 만들면 되는 문제이다.
  • 이 때 가장 중요한 부분은 중복을 허용하지 않으므로 visited[] 배열을 사용해서 방문처리를 해줘야한다.

[코드]


//boj15654번_N과 M (5)_백트래킹

#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;

int arr[9];
int result[9];

bool visited[9];

int N, M;

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

	for (int i = 0; i < N; i++) {
		if (!visited[i]) {
			visited[i] = true;
			arr[v] = result[i];
			DFS(v + 1);
			visited[i] = false;
		}
	}
}

int main() {
	cin >> N >> M;

	for (int i = 0; i < N; i++) {
		cin >> result[i];
	}

	sort(result, result + N);

	DFS(0);

	return 0;
}

0개의 댓글