👊 PS/Algorithm

[Baekjoon] 15666번: N과 M (12)

hades1 2024. 8. 13. 20:55

🥅 문제

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

 

🔍 설계

같은 수를 여러 번 사용해도 되므로, 수를 저장할 때 여러 개를 저장할 필요가 없으므로 중복을 제거한다. 중복을 제거하기 전에 오름차순 정렬이 이루어지므로, 비내림차순으로 결과를 출력할 준비가 되었다.

 

중복을 허용하므로 방문 처리는 필요가 없고, 비내림차순이므로 마지막으로 사용한 인덱스부터 이후까지 사용할 수 있다.

 

👊 풀이

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

int n, m, temp;
vector<int> number;
vector<int> result;

void bt(int count, int last_idx) {
	if (count == m) {
		for (int i = 0; i < m; i++) {
			cout << result[i] << " ";
		}
		cout << "\n";
		return;
	}

	for (int i = last_idx; i < n; i++) {
		result.push_back(number[i]);
		bt(count + 1, i);
		result.pop_back();
	}
}

int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		cin >> temp;
		number.push_back(temp);
	}
	
	sort(number.begin(), number.end());
	number.erase(unique(number.begin(), number.end()), number.end());
	n = number.size();

	bt(0, 0);
	
	return 0;
}