[백준] 14889 스타트와 링크

알파·2022년 7월 1일
0

인덱스보다 큰 수부터 돌아야하기 때문에 dfs 메서드 인자로 인덱스도 함께 넘겨야한다.
dfs를 n/2번 돌고 나서 체크된 팀을 스타트, 안된 팀을 링크로 계산해주고 min값을 구하면 답이 나오는 문제다.

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

public class Solution14889 {
    static int N;
    static int min = 987654321;
    static boolean[] visited;
    static int[][] arr;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        N = Integer.parseInt(br.readLine());
        visited = new boolean[N];
        arr = new int[N][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,0);
        System.out.println(min);
    }

    static void dfs(int idx, int depth) {
        if(depth == N/2) {
            cal();
            return;
        }
        for(int i = idx; i < N; i++) {
            if(!visited[i]) {
                visited[i] = true;
                dfs(i+1, depth+1);
                visited[i] = false;
            }
        }
    }

    static void cal() {
        int start = 0;
        int link = 0;
        for(int i = 0; i < N-1; i++) {
            for(int j = i+1; j < N; j++) {
                if(visited[i] && visited[j]) {
                    start += arr[i][j] + arr[j][i];
                } else if(!visited[i] && !visited[j]) {
                    link += arr[i][j] + arr[j][i];
                }
            }
        }

        int val = Math.abs(start - link);
        min = Math.min(min, val);
    }
}
profile
I am what I repeatedly do

0개의 댓글