본문 바로가기
온라인 저지/BOJ

[BOJ/Java] 14889 스타트와 링크

by ahj 2022. 2. 17.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class BOJ14889 {

	static int n, min;
	static int[][] S;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st;

		n = Integer.parseInt(br.readLine());
		S = new int[n][n];
		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < n; j++) {
				int data = Integer.parseInt(st.nextToken());
				S[i][j] = data;
			}
		}
		br.close();
		min = Integer.MAX_VALUE;
		combination(0, 0, 0);
		bw.write(min + "\n");
		bw.close();
	}

	private static void combination(int cnt, int start, int flag) {
		if (cnt == n / 2) {
			sumMethod(flag);
			return;
		}
		for (int i = start; i < n; i++) {
			combination(cnt + 1, i + 1, flag | 1 << i);
		}
	}

	private static void sumMethod(int flag) {
		int sumA = 0, sumB = 0;
		for (int i = 0; i < n; i++) {
			for (int j = i + 1; j < n; j++) {
				if ((flag & 1 << i) != 0 && (flag & 1 << j) != 0) {
					sumA += S[i][j] + S[j][i];
				} else if ((flag & 1 << i) == 0 && (flag & 1 << j) == 0) {
					sumB += S[i][j] + S[j][i];
				}
			}
		}
		min = Math.min(min, Math.abs(sumA - sumB));
	}

}

'온라인 저지 > BOJ' 카테고리의 다른 글

[BOJ/Java] 17298 오큰수  (0) 2022.02.17
[BOJ/Java] 1992 쿼드트리  (0) 2022.02.17
[BOJ/Java] 1182 부분수열의 합  (0) 2022.02.16
[BOJ/Java] 11723 집합  (0) 2022.02.15
[BOJ/Java] 2839 설탕 배달  (0) 2022.02.15

댓글