[백준] 15661 - 링크와 스타트 [JAVA]

 

코드

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

public class Main {
    static int[][] arr;
    static boolean[] visited;
    static int N;
    static int min = Integer.MAX_VALUE;

    // idx 인덱스, count 조합 개수(재귀 깊이)
    static void dfs(int count) {
        if (count == N) {
            int start = 0;
            int link = 0;

            for (int i = 0; i < N; i++) {
                for (int j = i + 1; j < N; j++) {
                    if (visited[i] != visited[j]) continue;
                    if (visited[i])
                        start += arr[i][j] + arr[j][i];
                    else
                        link += arr[i][j] + arr[j][i];
                }
            }
            int diff = Math.abs(start - link);
            if (diff < min) min = diff;
            return;
        }

        visited[count] = true;
        dfs(count + 1);
        visited[count] = false;
        dfs(count + 1);
    }

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        N = Integer.parseInt(br.readLine());
        arr = new int[N][N];
        visited = new boolean[N];

        // 입력값 초기화
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());

            for (int j = 0; j < N; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        dfs(0);
        System.out.println(min);
    }
}