본문 바로가기

algorithm/BOJ

백준 14889_스타트와 링크(C++)

 

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

 

14889번: 스타트와 링크

예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.

www.acmicpc.net

[문제 풀이]

완전탐색을 이용하여 문제를 풀었습니다.

 

스타트 팀과 링크 팀이 가질 수 있는 맴버의 경우 수를 모두 고려하여 check 배열에 메모제이션을 해줍니다.

 

그 후 반복문을 통해 스타트 팀과 링크 팀의 점수를 비교하여 가장 작은 수를 찾아 주었습니다.

[코드]

#include<iostream>

using namespace std;

int map[21][21];
int check[21] = { 0, };
int N;
int result = 987654321;

void bruteForce(int, int);
void score();

int main() {

	scanf("%d", &N);

	for (int i = 0; i < N; i++)
		for (int j = 0; j < N; j++)
			scanf("%d", &map[i][j]);

	for (int i = 0; i < N; i++) {
		check[i] = 1;
		bruteForce(i, 0);
		check[i] = 0;
	}

	printf("%d\n", result);

}

void score() {

	int start = 0, link = 0;

	for (int i = 0; i < N; i++) {

		if (check[i] == 1) {
			for (int j = i + 1; j < N; j++) {

				if (check[j] == 1) {
					start += map[i][j] + map[j][i];
				}

			}
		}
		else {
			for (int j = i + 1; j < N; j++) {

				if (check[j] == 0) {
					link += map[i][j] + map[j][i];
				}

			}
		}
	}

	int temp = (start > link) ? start - link : link - start;

	if (result > temp)
		result = temp;
}

void bruteForce(int idx, int cnt) {

	if (cnt == N / 2 - 1) {
		score();
		return;
	}
	
	for (int i = idx + 1; i < N; i++) {
		check[i] = 1;
		bruteForce(i, cnt + 1);
		check[i] = 0;
	}

}

 

 

 

 

'algorithm > BOJ' 카테고리의 다른 글

백준 15684_사다리 조작(C++)  (0) 2020.04.23
백준 15686_치킨 배달(C++)  (2) 2020.04.21
백준 14891_톱니바퀴(C++)  (0) 2020.04.17
백준 3190_뱀(C++)  (0) 2020.04.08
백준 2748_피보나치 수 2(C++)  (0) 2020.04.03