본문 바로가기
코딩테스트

[완전탐색] 백준 14889번 스타트와 링크

by Enhydra lutris 2022. 10. 13.

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

 

14889번: 스타트와 링크

예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.

www.acmicpc.net

Math.abs(a)

절댓값 구하는 메소드

Math.min(a,b)

최솟값 구하는 메소드

 

dfs

dfs로 팀구성

diff

점수차 계산 메소드

import java.util.*;

public class No14889 {
    static int N;
    static int[][] arr;
    static int min = Integer.MAX_VALUE;
    static boolean[] check;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        arr = new int[N + 1][N + 1];
        check = new boolean[N + 1];
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                arr[i][j] = sc.nextInt();
            }
        }

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

    static void dfs (int idx, int depth){
        if (depth == N / 2) {
            min = Math.min(min, diff());
            return;
        }
        for(int i = idx; i < N+1; i++){
            if (check[i])
                continue;
            check[i] = true;
            dfs(i+1, depth+1);
            check[i] = false;
        }
    }
    //점수 차 계산하는 메소드
    static int diff(){
        int start = 0;
        int link = 0;

        for (int i = 0; i < N; i++){
            for (int j = i+1; j < N; j++){
                if(check[i] && check[j]){
                    start += arr[i][j]+arr[j][i];
                }
                else if(check[i] == false && check[j] == false){
                    link += arr[i][j]+arr[j][i];
                }
            }
        }
        return Math.abs(start - link);
    }
}

예제를 넣으면 맞게 나오는데 백준에서는 실패로 뜬다.

댓글