관리 메뉴

Mini

백준 15654 N과 M (5) c++ // 순열, 인덱스를 저장후 실제원소에 접근하는 방법 본문

Algorithm/back_tracking

백준 15654 N과 M (5) c++ // 순열, 인덱스를 저장후 실제원소에 접근하는 방법

Mini_96 2023. 10. 2. 23:16

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

 

15654번: N과 M (5)

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

www.acmicpc.net

1. 핵심코드

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

	//int st = 1;
	//if (k != 0) st = arr[k - 1];

	for (int i = 0; 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);
	for (int i = 0; i < n; ++i) {
		cout<< num[i]<<" ";
	}
	cout << "\n";

	go(0);
}