1 minute read

문제 풀이 방식

  • DFS를 통한 백트랙킹 : 방문 여부 검사
  • BF로 모든 경우의 수 탐색

문제 풀이 (Java)

import java.util.*;

public class Main {
    static Scanner scanner = new Scanner(System.in);
    static int N;
    static int[][] stat;
    static int minimum = 100000;
    static boolean[] visited;

    public static void main(String[] args) {
        N = scanner.nextInt();
        scanner.nextLine();
        stat = new int[N][N];
        visited = new boolean[N + 1];

        for (int i = 0; i < N; i++) {
            String[] input = scanner.nextLine().split(" ");
            for (int j = 0; j < N; j++) {
                stat[i][j] = Integer.parseInt(input[j]);
            }
        }

        DFS(0, 0);
        System.out.println(minimum);
    }

    static void DFS(int D, int idx) {
        if (D == (N / 2)) {
            int S = 0, L = 0;
            for (int i = 0; i < N; i++) {
                for (int j = i + 1; j < N; j++) {
                    if (visited[i] && visited[j]) {
                        S += (stat[i][j] + stat[j][i]);
                    } else if (!visited[i] && !visited[j]) {
                        L += (stat[i][j] + stat[j][i]);
                    }
                }
            }
            minimum = Math.min(minimum, Math.abs(S - L));
        }

        for (int i = idx; i < N; i++) {
            if (!visited[i]) {
                visited[i] = true;
                DFS(D + 1, i + 1);
                visited[i] = false;
            }
        }
    }
}

Leave a comment