최대 1 분 소요

N과 M (백준 Silver 3)

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

가능한 수열의 조합을 출력하는 문제이다
재귀(백트래킹)를 통해 풀 수 있으며
어제 푼 백트래킹 문제보다 난이도가 낮았기에
비교적 쉽게 풀 수 있었다

해결 방식?

원래는 현재까지 출력한 횟수를 count로 담고
m에서 빼주려 하였으나
수열이 잘 출력되지 않았다
(나름대로 ‘가지치기’를 시도한?)

헌데 곰곰히 생각해 보니
출력은 ‘마지막’인 count == m 에서만
진행하면 더 깔끔하게 수열이 출력되었고
이미 ‘수열’이 완성된 상황에서만 출력하니
딱히 가지치기를 할 필요가 없었다

그렇기에 set을 통해
인덱스 중복만 검사하고
vector로 수열을 저장한 뒤
마지막에 출력해주는 것으로 통과하였다

Image

제출한 코드

#include<iostream>
#include<vector>
#include<unordered_set>
#include<algorithm>

using namespace std;

void recur(const vector<int>& nums, vector<int>& selected,unordered_set<int>& selectIdx,int m)
{
	int count = selected.size();
	if (count == m)
	{
		for (int v : selected)
			cout << v << ' ';
		cout << '\n';
		return;
	}

	for (int i = 0; i < nums.size(); i++)
	{
		if (selectIdx.find(i) != selectIdx.end())
			continue;

		selected.push_back(nums[i]);
		selectIdx.insert(i);
		recur(nums, selected, selectIdx, m);
		selected.pop_back();
		selectIdx.erase(i);
	}
}

int main()
{
	int n, m;
	cin >> n >> m;

	vector<int> vec(n);

	for (int i = 0; i < n; i++)
	{
		int t;
		cin >> t;
		vec[i] = t;
	}

	sort(vec.begin(), vec.end());
	vector<int> selected;
	unordered_set<int> selectIdx;
	recur(vec, selected, selectIdx, m);

	return 0;
}

댓글남기기