관리 메뉴

Mini

백준 15666 N과 M(12) c++ // 서로같은 n H m , 중복조합 구현 본문

Algorithm/back_tracking

백준 15666 N과 M(12) c++ // 서로같은 n H m , 중복조합 구현

Mini_96 2023. 10. 3. 01:38

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

 

15666번: N과 M (12)

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

www.acmicpc.net

1. 핵심로직

1.1 스타트부분 추가 => 조합구현

1.2 방문부분 주석 => 중복구현

1.3 이전 막항과 추가할 값 비교 추가 => 중복된 수열이면 pass!

 

2. 전체코드

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

int n,m;
int num[10],arr[10];
int isused[10];

//현재까지 k개의 수를 선택함.
void go(int k) {
	if (k==m){
		for (int i = 0; i < m; ++i) {
			cout << num[arr[i]] << " ";
		}
		cout << "\n";
		return;
	}

	//스타트=> 조합구현
	int st = 0;
	if (k != 0) st = arr[k - 1];

	int tmp = 0;
	for (int i = st; i < n; ++i) {
		//if (isused[i]) continue;
		if (tmp == num[i]) continue;	
		//(이전수열의 막항 == 새로추가할 값)중복된 수열이면 패스!

		arr[k] = i;	//idx 간접 저장
		tmp = num[arr[k]];	//마지막항 저장
		isused[i] = 1;	
		go(k+1);
		isused[i] = 0;
	}

}


int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	cin >> n>>m;
	for (int i = 0; i < n; ++i) {
		cin >> num[i];
	}
	sort(num,num+n);	//정렬 end 제한 => 입력안된 0초기값 정렬안되게

	go(0);
}