알고리즘/백준

백준 14889 스타트와 링크 삼성 SW 역량 테스트 기출 c++

이영재의오른발 2022. 7. 1. 16:30
반응형

간단한 조합문제다. 조합을 이용해 두개로 팀을 나누고 나눈 팀의 점수합을 비교하면 된다.

#include <iostream>
#include <vector>
using namespace std;

int v[21][21];
int min_tmp = 9999;
int n;
bool check[21];
int c = 0;
void combination(int x,int y) 
{
	if(y == n/2) {
		c++;
		int sum;
		int sum_lee = 0;
		int sum_shin = 0;
		int lee[21];
		int lee_cnt = 0;
		int shin[21];
		int shin_cnt = 0;
		
		for(int i=1; i<=n; i++) {
			if(check[i] == true) {
				lee[lee_cnt++] = i;
			}
			else {
				shin[shin_cnt++] = i;
			}
		}
		for(int i=0; i<lee_cnt; i++) {
			for(int j=0; j<lee_cnt; j++) {
				if(i == j) {
					continue;
				}
				else {
					sum_lee = sum_lee + v[lee[i]][lee[j]];
				}
			}
		}
		
		for(int i=0; i<lee_cnt; i++) {
			for(int j=0; j<lee_cnt; j++) {
				if(i == j) {
					continue;
				}
				else {
					sum_shin = sum_shin + v[shin[i]][shin[j]];
				}
			}
		}
		sum = sum_lee-sum_shin;
		if(sum < 0) {
			sum = -sum;
		}
		if(min_tmp > sum) {
			min_tmp = sum;
		}
	}
	
	for(int i=x; i<=n; i++) {
		if(check[i])	continue;
		check[i] = true;
		combination(i,y+1);
		check[i] = false;
	}
	
	
} 


int main(void)
{
	cin >> n;
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++) {
			cin >> v[i][j];
		}
	}
	
	combination(1,0);
	
	cout << min_tmp;
	return 0;
}

생각나는대로 대충 써서 코드가 많이 더러워진게 매력이다.

728x90
반응형