KoreanFoodie's Study

[종만북 문제] 소풍 (문제 ID : PICNIC, 난이도 : 하) 본문

Data Structures, Algorithm/종만북

[종만북 문제] 소풍 (문제 ID : PICNIC, 난이도 : 하)

GoldGiver 2024. 3. 3. 19:55

프로그래밍 대회에서 배우는 알고리즘 문제해결 전략(이하 종만북)에서 소개된 문제를 풀이합니다. 알고리즘에 진심이시라면, 직접 구매하셔서 읽어보시는 것을 추천합니다!

핵심 :

1. 재귀 + 완전 탐색으로 풀 수 있다.

[종만북 문제] 소풍 (문제 ID : PICNIC, 난이도 : 하)

이번 문제도 일단, 완전 탐색으로 풀 수 있는 문제이긴 하다. 거기에 약간의 재귀가 필요한데... 일단 소스 코드부터 첨부해 보겠다.

#include <iostream>
#include "stdlib.h"
#include <vector>

using namespace std;

int N;
vector<pair<int, int>> pairs;
int ans;

void makeGroup(vector<bool>& visit, int cur, int len)
{
	if (len == N)
	{
		ans += 1;
		return;
	}

	// check candidates starting from cur
	for (int i = cur; i < pairs.size(); ++i)
	{
		int l = pairs[i].first;
		int r = pairs[i].second;

		if (visit[l] || visit[r])
			continue;

		visit[l] = true;
		visit[r] = true;

		makeGroup(visit, i + 1, len + 2);
		
		visit[l] = false;
		visit[r] = false;
	}
}

void sol()
{
	ans = 0;

	vector<bool> visit(N, false);
	makeGroup(visit, 0, 0);

	cout << ans << endl;
}

void inputHandler()
{
	cin >> N;
	int friends = 0;
	cin >> friends;

	pairs.clear();
	for (int i = 0; i < friends; ++i)
	{
		int l, r;
		cin >> l;
		cin >> r;
		pairs.push_back({ l, r });
	}
}

int main()
{
	int cases;
	cin >> cases;
	while (cases--)
	{
		inputHandler();

		sol();
	}

	return 0;
}

 

그런데 책에 나온 재귀 호출 코드는 더욱 깔끔하다 ㅋㅋ

그렇다면 답의 상한은 어떨까?

사람은 10명까지 이고, 이때 모든 학생이 친구라면 경우의 수가 제일 많이 나올 것이다. 이 경우, 최종 답의 갯수는 9 * 7 * 5 * 3 * 1 = 945 가 된다는 것을 알 수 있다. 😁

Comments