본문 바로가기

CodingTest Exam/코딩테스트 실전 모의고사(with C++) : 대기업 대비

1-4. 바둑대회(DFS) ★★★★☆

#include <iostream>
#include <cmath>
#include <vector>

using namespace std;

int abil[2][16];
int ch[16];
int n, res = 2147000000;

void DFS(int s, int L)
{
	if(L == n/2)
	{
		vector<int> A, B;
		
		for(int i = 0; i < n; i++)
		{
			if(ch[i] == 1)
				A.push_back(i);
			else
				B.push_back(i);
		}
		
		int sumA = 0, sumB = 0;
		
		for(int i = 0; i < A.size(); i++)
		{
			sumA += abil[0][A[i]];
			sumB += abil[1][B[i]];
		}
		
		res = min(res, abs(sumA - sumB));
	}
	else
	{
		for(int i = s; i < n; i++)
		{
			ch[i] = 1;
			DFS(i+1, L+1);
			ch[i] = 0;
		}
	}
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	
	cin >> n;
	
	for(int i = 0; i < n; i++)
	{
		cin >> abil[0][i] >> abil[1][i];
	}
	
	DFS(0, 0);
	
	cout << res << "\n";
	
	return 0;
}

1. 각 선수의 능력치 입력을 다음과 같이 받는다.

87 66 93 72 78
84 78 94 92 63

2. 1번부터 6번 선수 중 3명을 뽑는다. 뽑은 선수를 흰돌팀(vector A), 뽑지 않은 선수를 검은돌팀(vector B)으로 간주한다.

3. 각 팀의 능력치를 더해서 뺀 값의 절댓값 중 가장 작은 값을 출력한다.