[BOJ] C++ 15663 "N과 M(9)" 문제 풀이 _ nov

반응형
반응형

#INFO

난이도 : SILVER2

문제유형 : 백트래킹

출처 : 15663번: N과 M (9) (acmicpc.net)

 

15663번: N과 M (9)

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

www.acmicpc.net


#SOLVE

백트래킹 방식으로 문제를 풀이했다. 수열을 입력받은 후 sort 함수를 이용해 오름차순으로 정렬한 뒤, 중복이 발생하지 않도록 출력을 해야한다. 2번째 케이스 n = 4 , m = 2 , [9, 7, 9, 1] 를 예로 들어보면 중복 처리를 하지 않는다면 [7, 9]가 2번 출력되고 만다.

따라서 소스 코드에 "이전 수열의 마지막 항과 새로운 수열이 마지막 항이 같은 경우" 중복 처리를 하는 코드를 추가해 주면 중복된 코드 없이 수열이 오름차 순으로 출력되게 된다.


#CODE

#include <bits/stdc++.h>
using namespace std;

int n, m;
int arr[10];
int num[10];
bool isVisited[10];

void recur(int k){
	if(k == m){
		for(int i = 0; i < m; i++)
			cout << num[arr[i]] << " ";
		cout << '\n';
		return;
	}
	int tmp = 0;
	for(int i = 0; i < n; i++){
		if(!isVisited[i] && tmp != num[i]){
			arr[k] = i;
			tmp = num[i];
			isVisited[i] = true;
			recur(k+1);
			isVisited[i] = false;
		}
	}
}

int main(void) {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n >> m;
	for(int i = 0; i < n; i++)
		cin >> num[i];
	sort(num, num + n);
	recur(0);
	return 0;
}
반응형

댓글

Designed by JB FACTORY