algorithm

백준 3980(JAVA)

yjs3819 2021. 11. 1. 12:44
728x90

문제

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

 

3980번: 선발 명단

각각의 테스트 케이스에 대해서, 모든 포지션의 선수를 채웠을 때, 능력치의 합의 최댓값을 한 줄에 하나씩 출력한다. 항상 하나 이상의 올바른 라인업을 만들 수 있다.

www.acmicpc.net

풀이

11개의 포지션에 11명의 선수를 넣어주면 된다.
모든 경우의수를 돌며 최대 값을 뽑으면된다.

단, 해당 포지션의 성능이 0이면 해당 포지션에 선수를 배치하지 못하는 가지치기 조건을 이용해 경우의 수를 대폭 줄이면 된다.

즉, 백트래킹을 통해 가지치기로 시간적 이득을 봐야만 맞을수 있는 문제이다.

너무간단한데, 테스트 횟수가 있으므로 static 변수를 사용한다면 초기화를 계속 해줘야한다. (이거 놓쳐서 2번 틀림)

코드

package training.backtracking;

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

public class Main3980 {
    static int T;
    static int[][] S;
    static int[] result;
    static boolean[] visited;
    static int max = -1;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        T = Integer.parseInt(br.readLine());
        for(int v = 0; v < T; v++){
            S = new int[11][11];
            result = new int[11];
            visited = new boolean[11];
            max = -1;

            for(int i = 0; i < 11; i++){
                StringTokenizer st = new StringTokenizer(br.readLine(), " ");
                for(int j = 0; j < 11; j++){
                    S[i][j] = Integer.parseInt(st.nextToken());
                }
            }

            //포지션 11개에 각선수들을 배치하자.

            recursive(0);

            System.out.println(max);
        }
    }
    static void recursive(int m){
        if(m == 11){
            int sum = 0;
            for(int i = 0; i < 11; i++){
                sum += S[result[i]][i];
            }
            max = Math.max(max, sum);
            return;
        }

        for(int i = 0; i < 11; i++){
            if(!visited[i] && S[i][m] != 0){
                visited[i] = true;
                result[m] = i;
                recursive(m + 1);

                visited[i] = false;
            }
        }
    }
}
728x90

'algorithm' 카테고리의 다른 글

백준 2108(JAVA)  (0) 2022.06.15
백준 11723(JAVA)  (0) 2022.06.13
백준 2661(JAVA)  (0) 2021.10.31
백준 1174(JAVA)  (0) 2021.10.17
백준 16987(JAVA)  (0) 2021.10.12