danbibibi
article thumbnail

문제

문제 바로가기> BOJ 14889번: 스타트와 링크

 

14889번: 스타트와 링크

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

www.acmicpc.net

 

풀이

start와 link 팀을 나눌 수 있는 모든 경우의 수로 나누어주고, 두 팀의 능력치 차이의 최솟값을 구해주었다.

 

C++

#include<iostream>
#include<vector>
#define MAX 21
#define INF 1000000001
using namespace std;

int N, ans = INF;
int score[MAX][MAX];
bool start_team[MAX];

void input() {
	cin >> N;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) cin >> score[i][j];
	}
}

void solution(int idx, int cnt) {
	if (cnt == N / 2) {
		int start = 0, link = 0;
		for (int i = 0; i < N; i++) {
			for (int j = i + 1; j < N; j++) {
				if (start_team[i] == start_team[j]) {
					if (start_team[i]) start += (score[i][j] + score[j][i]);
					else link += (score[i][j] + score[j][i]);
				}
			}
		}
		ans = min(ans, abs(start - link));
		return;
	}
	for (int i = idx; i < N; i++) {
		start_team[i] = true;
		solution(i + 1, cnt + 1);
		start_team[i] = false;
	}
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0);
	input();
	solution(0, 0);
	cout << ans;
}

 

Java

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	
	static int N, ans=Integer.MAX_VALUE;
	static int[][] score;
	static boolean[] start_team;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		N = Integer.parseInt(st.nextToken());
		score = new int[N][N];
		start_team = new boolean[N];
		
		for(int i=0; i<N; i++) {
			st = new StringTokenizer(br.readLine());
			for(int j=0; j<N; j++) {
				score[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		solution(0, 0);
		System.out.println(ans);
	}

	private static void solution(int idx, int cnt) {
		if (cnt == N / 2) {
			int start = 0, link = 0;
			for (int i = 0; i < N; i++) {
				for (int j = i + 1; j < N; j++) {
					if (start_team[i] == start_team[j]) {
						if (start_team[i]) start += (score[i][j] + score[j][i]);
						else link += (score[i][j] + score[j][i]);
					}
				}
			}
			ans = Math.min(ans, Math.abs(start - link));
			return;
		}
		for (int i = idx; i < N; i++) {
			start_team[i] = true;
			solution(i + 1, cnt + 1);
			start_team[i] = false;
		}
	}
}

'문제 풀이 > SW 역량 테스트' 카테고리의 다른 글

BOJ 17144번: 미세먼지 안녕!  (0) 2023.01.12
BOJ 14502번: 연구소  (0) 2023.01.11
BOJ 15686번: 치킨 배달  (0) 2023.01.10
BOJ 14888번: 연산자 끼워넣기  (0) 2023.01.09
BOJ 14503번: 로봇 청소기  (0) 2023.01.08
profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로