곽로그

[백준 14889, Java] 스타트와 링크 본문

알고리즘/백준

[백준 14889, Java] 스타트와 링크

일도이동 2021. 4. 12. 21:19
반응형

문제

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

 

풀이

 우선 스타트 팀인 N/2 명을 뽑는다. 이 문제는 N과 M(2) 문제와 같다. 대신 boolean[] isStartTeam 배열을 선언해서, 스타트팀으로 뽑힌 사람의 번호를 true로 한다. 왜냐하면, 스타트 팀을 뽑으면 링크팀은 자동으로 나머지 사람이 되는데, 이때 스타트팀인지 아닌지를 구분하기 위해서이다. 

 

 스타트팀인 N/2명을 구했다면, 스타트팀이 아닌 N/2명을 링크팀으로 한다. 그런 다음 이중 for문을 이용해서 두팀의 능력치를 구한다. 

 

코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    static int N;
    static int[][] ability;

    static boolean[] isStartTeam;
    static int[] startTeam;
    static int[] linkTeam;

    static int min;
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        N = Integer.parseInt(br.readLine());
        ability = new int[N+1][N+1];

        for(int r = 1; r<=N; r++){
            st = new StringTokenizer(br.readLine()," ");
            for(int c = 1; c<=N; c++){
                ability[r][c] = Integer.parseInt(st.nextToken());
            }
        }

        isStartTeam = new boolean[N+1];
        startTeam = new int[N/2];
        linkTeam = new int[N/2];

        min = Integer.MAX_VALUE;
        getGap(0,0);
        bw.write(String.valueOf(min));
        bw.flush();


    }
    public static void getGap(int beforeStartMember, int index){
        if(index>=N/2){
           //링크팀 구하기
            int i = 0;
            for(int number = 1; number<=N; number++){
                if(!isStartTeam[number]){
                    linkTeam[i] = number;
                    ++i;
                }
            }

            //능력치 구하기
            int startPotion = 0;
            int linkPotion = 0;
            for(int j = 0; j<startTeam.length; j++){
                for(int k = 0; k<startTeam.length; k++){
                    startPotion += ability[startTeam[j]][startTeam[k]];
                    linkPotion += ability[linkTeam[j]][linkTeam[k]];
                }
            }

            int gap = Math.abs(startPotion-linkPotion);
            min = Math.min(gap,min);

        }
        else{
            for(int nextMember = beforeStartMember+1; nextMember<=N; nextMember++){
                isStartTeam[nextMember] = true;
                startTeam[index] = nextMember;

                getGap(nextMember, index+1);
                isStartTeam[nextMember] = false;
            }
        }
    }
}
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 2529, Java] 부등호  (0) 2021.04.13
[백준 15661, Java] 링크와 스타트  (0) 2021.04.13
[백준 18290, Java] 퇴사  (0) 2021.04.12
[백준 14503 ,Java] 로봇 청소기  (0) 2021.04.08
[백준 15684, Java] 사다리 조작  (0) 2021.03.31
Comments