※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 20009번 문제인 형곤이의 소개팅이다.
문제는 아래 링크를 확인하자.

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

 

20009번: 형곤이의 소개팅

연애가 하고싶은 형곤이는 소개팅을 통해서 자신의 짝을 만나려고 한다. 형곤이의 소개팅에는 특별한 규칙이 있다. 남자와 여자가 각각 N명씩 만나서 서로가 만나고 싶은 순위를 정해서 최적의

www.acmicpc.net

주어진 문제는 Stable Marriage Problem(Stable Matching Problem; 이하 SMP)과 같다. SMP를 O(N^2)에 해결하는 알고리즘으로 Gale-Shapley 알고리즘이 잘 알려져있다.

 

주어진 사람들을 쉽게 표현하기 위해 map 등을 이용해 각자를 1~N의 정수로 표현하고, 이 정수를 이용하여 Gale-Shapley 알고리즘을 구현해 문제를 해결하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <queue>
#include <map>
#include <string>
using namespace std;

map<string, int> mpM;
map<string, int> mpF;
string sM[201];
string sF[201];

int MtoF[201][201];
int FtoM[201][201];
int iter[201];
int matching[201]; // F가 matching된 사람

int ans[201];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int N; cin >> N;

	for (int i = 1; i <= N; i++) {
		string& tmp = sM[i];
		cin >> tmp;
		mpM.insert(make_pair(tmp, i));
	}

	for (int i = 1; i <= N; i++) {
		string& tmp = sF[i];
		cin >> tmp;
		mpF.insert(make_pair(tmp, i));
	}
	
	for (int i = 1; i <= N; i++) {
		string si; cin >> si;
		int ii = mpM[si];
		for (int j = 1; j <= N; j++) {
			string sj; cin >> sj;
			int xx = mpF[sj];
			MtoF[ii][j] = xx;
		}
	}

	for (int i = 1; i <= N; i++) {
		string si; cin >> si;
		int ii = mpF[si];
		for (int j = 1; j <= N; j++) {
			string sj; cin >> sj;
			int xx = mpM[sj];
			FtoM[ii][xx] = j;
		}
	}

	queue<int> que;
	for (int i = 1; i <= N; i++) {
		que.push(i);
	}

	while (!que.empty()) {
		int curM = que.front(); que.pop();
		int curF = MtoF[curM][++iter[curM]];
		int& matchingF = matching[curF];
		if (matchingF == 0) matchingF = curM;
		else if (FtoM[curF][curM] < FtoM[curF][matchingF]) {
			que.push(matchingF);
			matchingF = curM;
		}
		else que.push(curM);
	}

	for (int i = 1; i <= N; i++) ans[matching[i]] = i;

	for (int i = 1; i <= N; i++) cout << sM[i] << ' ' << sF[ans[i]] << '\n';
}
728x90

+ Recent posts