Java

[백준 14889] 스타트와 링크 (JAVA)

iheeeee6-6 2023. 3. 20. 14:55
728x90

 

 

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

 

 

생각보다 많이 헤맨 문제였다...

n/2의 선수로 나누는 것으로 모든 선수는 스타트팀과 링크팀으로 무조건 들어간다!!

재귀함수를 통해서 count를 증가시키면서 

방문한 곳은 스타트 팀 소속, 방문하지 않은 곳은 링크 팀 소속으로 배정하여 계산한다!!

 

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

public class Main {
	static boolean[] check;
	static int min=Integer.MAX_VALUE;
	static int t;
	static int[][] arr ;
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		t = Integer.parseInt(br.readLine());
		arr = new int[t][t];
		for (int i = 0; i < t; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			for (int j = 0; j < t; j++) {
				arr[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		check = new boolean[t];
		check(0,0);
		System.out.println(min);
	}
	
	static void check(int idx,int count) {
		if(count==t/2) {
			cul();
			return;
		}
		for(int i=idx;i<t;i++) {
			if(!check[i]) {
				check[i]=true;
				check(i+1,count+1);
				check[i]=false;
			}
		}
	}
	
	static void cul() {
		int team_start=0;
		int team_link=0;
		
		for(int j=0;j<t-1;j++) {
			for(int z=j+1;z<t;z++) {
				if(check[j]==true&&check[z]==true) {
					team_start+=arr[j][z];
					team_start+=arr[z][j];
				}
				else if(check[j]==false&&check[z]==false) {
					team_link+=arr[j][z];
					team_link+=arr[z][j];
				}
			}
		}

		int diff = Math.abs(team_start-team_link);
		if(diff==0) {
			System.out.println(0);
			System.exit(0);
		}
		
		min = Math.min(min, diff);
		
	}

}

'Java' 카테고리의 다른 글

[백준 13305] 주유소 (JAVA)  (0) 2023.03.22
[백준 20438] 출석체크 (JAVA)  (0) 2023.03.22
[백준 1406] 에디터 (JAVA)  (0) 2023.03.19
[백준 1629] 곱셈 (JAVA)  (0) 2023.03.12
[백준 2740] 행렬 곱셈 (JAVA)  (0) 2023.03.12