Algorithm/백준 문제풀이

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

너지살 2024. 3. 12. 23:19

 

 

 

문제 출저

https://www.acmicpc.net/problem/15661

 

15661번: 링크와 스타트

첫째 줄에 N(4 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에 S가 주어진다. 각 줄은 N개의 수로 이루어져 있고, i번 줄의 j번째 수는 Sij 이다. Sii는 항상 0이고, 나머지 Sij는 1보다 크거나 같고, 100

www.acmicpc.net

 

 

 

문제 풀이

백트래킹을 통해 팀을 정합니다. 각 팀의 능력치를 합해서 최소값을 구합니다. 

 

 

 

소스 코드

package baekjoon.year24.month3.day1120.day12;

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

/*
링크와 스타트
https://www.acmicpc.net/problem/15661

2의 10승 = 1024
10! = 3628800
3,715,891,200 = 37억

근데 합격된다 왜지..?

 */

public class B15661 {

    static int n;
    static int[][] board;
    static boolean[] selected ;

    static int answer;

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

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        board = new int[n][n];
        for (int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int j = 0; j < n; j++) {
                board[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        selected = new boolean[n];
        answer = Integer.MAX_VALUE;
        dfs(0);

        System.out.println(answer);

    }

    public static void dfs(int stage) {

        if (stage == n) {

            int start = 0;
            int link = 0;

            for (int i = 0; i < n-1; i++) {
                for (int j = i + 1; j < n; j++) {
                    if (selected[i] == selected[j]) {
                        if (selected[i] == true) {
                            start += board[i][j] + board[j][i];
                        }
                        else {
                            link += board[i][j] + board[j][i];
                        }
                    }
                }
            }

            int result = Math.abs(start - link);
            answer = Math.min(answer, result);

            return;
        }

        selected[stage] = true;
        dfs(stage+1);

        selected[stage] = false;
        dfs(stage+1);



    }

}