Baekjoon Review

[Silver 2] 15663번 N과 M (9)

hanseongbugi 2023. 11. 8. 12:44

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

 

15663번: N과 M (9)

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

www.acmicpc.net

 

이 문제는 벡트래킹을 통해 해결할 수 있다.

 

알고리즘은 다음과 같다.

  • 입력 배열의 요소를 정렬한다. (오름차순 출력을 위해)
  • dfs를 0번 요소부터 수행한다.
  • 만약 M번째 자리까지 탐색했다면 출력한다.
  • 0번째 요소부터 N번째 요소까지 반복을 진행한다.
    • 이때 방문하지 않았으며, i번째 배열의 요소가 중복된 값이 아니라면
    • 출력을 위한 배열에 값을 삽입하고, 중복 값 검사를 위한 변수에 i번째 요소를 넣는다.
    • 방문 표시를하고 다음 자리를 탐색한다.
    • 탐색이 끝나면 방문하지 않았다고 값을 초기화한다.

 

#include <iostream>
#include <algorithm>
using namespace std;
int N, M, arr[9], result[9]; 
int visited[9] = { 0, };

void dfs(int cnt) {
	if (cnt == M) {
		for (int i = 0; i < M; i++)
			printf("%d ", result[i]);
		printf("\n");
		return;
	}
	int num = 0;
	for (int i = 0; i < N; i++) {
		if (!visited[i] && arr[i] != num) {
			result[cnt] = arr[i];
			num = result[cnt];
			visited[i] = 1;
			dfs(cnt + 1);
			visited[i] = 0;
		}
	}
}
int main() {
	cin >> N >> M;
	for (int i = 0; i < N; i++)
		cin >> arr[i];
	sort(arr, arr + N);
	dfs(0);
}