거의 알고리즘 일기장

N과 M 본문

알고리즘 문제풀이

N과 M

건우권 2020. 6. 24. 13:48

https://www.acmicpc.net/workbook/view/2052

 

문제집: N과 M (baekjoon)

 

www.acmicpc.net

풀이방법

이 N과 M의 풀이방식이 다 똑같고 중복이나 오름차순? 같은 추가 옵션들만 추가해주면 됨. 그러므로 N과 M(12) 소스코드를 참고하시길 바란다.


코드

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

using namespace std;

int N, M;
vector<int> num;
vector<vector<int>> answer;
bool isVisited[9];

bool cmp(const vector<int>& a, const vector<int>& b)
{
	for (int i = 0; i < M; i++)
	{
		if (a[i] == b[i] && i !=M-1) continue;
		return a[i] < b[i];
	}
}

void GetSequence(int cnt, vector<int>visited)
{
	if (cnt == M)
	{
		//중복일시
		answer.push_back(visited);
		return;
	}

	for (int i = 0; i < N; i++)
	{
		if (!visited.empty() && num[i] < visited[visited.size() - 1])
			continue;

		visited.push_back(num[i]);
		GetSequence(cnt + 1, visited);
		visited.erase(--end(visited));
	}
}

int main()
{
	//input
	cin >> N >> M;
	int n;
	for (int i = 0; i < N; i++)
	{
		cin >> n;
		num.push_back(n);
	}
	sort(begin(num), end(num));
	GetSequence(0, vector<int>(0));

	sort(begin(answer), end(answer), cmp);
	
	vector<int> before;
	for (auto ans : answer)
	{
		if (before == ans)
			continue;
		before = ans;

		for (auto ele : ans)
			cout << ele << ' ';
		cout << '\n';
	}


	return 0;
}

반응형
Comments