곽로그

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

알고리즘/백준

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

일도이동 2021. 4. 13. 10:08
반응형

문제

www.acmicpc.net/problem/15661

 

15661번: 링크와 스타트

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

www.acmicpc.net

 

풀이

 스타트와 링크 문제와 달라진 점은 팀을 N/2 N/2로 나누지 않고 각 팀의 수를 다르게 나눠도 된다는 거다. 즉 N=4이라 했을 때 가능한 팀원 수(스타트팀, 링크팀)는 (1,3) (2,2) (3,1)이다.

 

 따라서 이 문제도 스타트팀을 기준으로 생각하면 된다. 스타트팀에 1명을 뽑았다면, 링크팀은 3명이고 그 멤버는 스타트팀이 아닌 사람이다. 

 

코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;
/*
두 팀의 인원수는 같지 않아도 되지만, 한 명 이상이어야 한다.
-> 스타트팀을 뽑는다 1명~ N-1명
 */
public class Main {
    static int N;
    static int[][] ability;

    static int[] startTeam;
    static int[] linkTeam;
    static boolean[] isStartTeam;
    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;

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

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

        for(int pickCount = 1; pickCount<=N-1; pickCount++){
            startTeam = new int[pickCount];
            linkTeam = new int[N-pickCount];
            isStartTeam = new boolean[N+1];
            pickStartTeam(pickCount, 0  , 0);
        }

        bw.write(String.valueOf(min));
        bw.flush();
    }

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

            // 능력 차 구하기
            int startTeamAbility = 0;
            int linkTeamAbility = 0;
            for(int k = 0; k<startTeam.length;k++){
                for(int j = 0; j<startTeam.length; j++){
                    startTeamAbility+= ability[startTeam[k]][startTeam[j]];
                }
            }

            for(int k = 0; k<linkTeam.length; k++){
                for(int j = 0; j<linkTeam.length; j++){
                    linkTeamAbility+= ability[linkTeam[k]][linkTeam[j]];
                }
            }

            int gap = Math.abs(startTeamAbility-linkTeamAbility);
            min = Math.min(min, gap);

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

                pickStartTeam(pickCount, number, index+1);
                isStartTeam[number] = false;
            }
        }
    }
}
반응형

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

[백준 1707, Java] 이분 그래프  (0) 2021.04.22
[백준 2529, Java] 부등호  (0) 2021.04.13
[백준 14889, Java] 스타트와 링크  (0) 2021.04.12
[백준 18290, Java] 퇴사  (0) 2021.04.12
[백준 14503 ,Java] 로봇 청소기  (0) 2021.04.08
Comments