21.09.11 기록

1 분 소요

백준 알고리즘 14889 풀이

🎆끄적여본 오답…
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class B14889 {
    public static int N;
    public static int[][] nums;
    public static boolean[] team;
    public static int min = Integer.MAX_VALUE;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        nums = new int[N][N];
        team = new boolean[N];

        StringTokenizer st;
        for(int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine(), " ");

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

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

    public static void dfs(int depth) {
        if(depth == (N/2)) {
//            min = Math.min(Math.abs(s1-s2), min);
            return;
        }

        for(int i = 0; i < N; i++) {
            if(!team[i]) {
                team[i] = true;
                // ...
            }
        }
    }
}


🎆해설(메모리 21.1MB, 시간 364ms로 통과)

-계속 연습하다 보면 언젠간 풀 수 있지 않을까 싶다..🙄

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

public class B14889 {
    public static int N;
    public static int[][] nums;
    public static boolean[] visit;
    public static int min = Integer.MAX_VALUE;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());

        nums = new int[N][N];
        visit = new boolean[N];

        StringTokenizer st;
        for(int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine(), " ");

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

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

    public static void dfs(int idx, int cnt) {
        if(cnt == N/2) {
            diff();
            return;
        }

        for(int i = idx; i < N; i++) {
            if(!visit[i]) {
                visit[i] = true;
                dfs(i+1, cnt+1);
                visit[i] = false;
            }
        }
    }

    public static void diff() {
        int teamStart = 0;
        int teamLink = 0;

        for(int i = 0; i < (N-1); i++) {
            for(int j = (i+1); j < N; j++) {
                if(visit[i] && visit[j]) {
                    teamStart += nums[i][j];
                    teamStart += nums[j][i];
                } else if (!visit[i] && !visit[j]) {
                    teamLink += nums[i][j];
                    teamLink += nums[j][i];
                }
            }
        }

        int val = Math.abs(teamStart - teamLink);

        //차이가 0이면 탐색 종료
        if(val == 0) {
            System.out.println(val);
            System.exit(0);
        }

        min = Math.min(val, min);
    }
}


카테고리:

업데이트: