관리 메뉴

Mini

백준 15655N과 M(6) c++ // 조합, 인덱스를 돌리고 return에서 내용에 접근하라 본문

Algorithm/back_tracking

백준 15655N과 M(6) c++ // 조합, 인덱스를 돌리고 return에서 내용에 접근하라

Mini_96 2023. 10. 2. 23:27

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

 

15655번: N과 M (6)

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

www.acmicpc.net

1. 핵심코드 

st=0임에 주의!

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

for (int i = st; i < n; ++i) {

 

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]+1;

	for (int i = st; i < n; ++i) {
		if (isused[i]) continue;
		arr[k] = i;	//arr에 인덱스를 기록, return에서 인덱스로 접근하면됨.
		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);

	go(0);
}