관리 메뉴

Mini

백준 15663 N과 M(9) c++ // 서로같은 n P m, 중복된수열 검사하는 방법 본문

Algorithm/back_tracking

백준 15663 N과 M(9) c++ // 서로같은 n P m, 중복된수열 검사하는 방법

Mini_96 2023. 10. 3. 01:14

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

 

15663번: N과 M (9)

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

www.acmicpc.net

1. 중복된수열 검사하는 방법

1.1 tmp 배열에는 이전수열의 막항 저장

1.2 tmp == num[i] (추가할값) 이면 중복된 값을 저장하는것 -> pass 해야함.

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

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

 

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 << arr[i] << " ";
		}
		cout << "\n";
		return;
	}

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

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

		arr[k] = num[i];	//원소 직접저장
		tmp = 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);
}