알고리즘/백준

백준 3980 (선발 명단) java

김다미김태리신시아 2023. 1. 1. 23:40

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

 

3980번: 선발 명단

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

www.acmicpc.net

import java.io.*;
import java.util.*;
public class Main {
    static int[][] board = new int[11][11];
    static boolean[] isIn = new boolean[11];
    static int[] value = new int[11];
    static int result = 0;
    static int num = 0;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        num = Integer.parseInt(br.readLine());
        int[] rarr = new int[num];
        for(int k=0;k<num;k++) {
            for (int i = 0; i < 11; i++) {
                StringTokenizer st = new StringTokenizer(br.readLine(), " ");
                for (int j = 0; j < 11; j++) {
                    board[i][j] = Integer.parseInt(st.nextToken());
                }
            }
            travel(0, 0);
            rarr[k]=result;
            result = 0;
        }
        for(int i=0;i<num;i++)
        {
            System.out.println(rarr[i]);
        }
        br.close();
    }

    static void travel(int k,int v)
    {
        if(k==11)
        {
            if(result<v)
            {
                result = v;
            }

            return;
        }

        for(int i=0;i<11;i++)
        {
            if(board[k][i]!=0)
            {
                if(!isIn[i])
                {
                    isIn[i]=true;
                    travel(k+1,v+board[k][i]);
                    isIn[i]=false;
                }

            }
        }
    }
}

생각보다 간단한 문제이다. 만약 해당 자리에 선수가 이미 배정이 되었는데 더 큰 점수를 가진 선수가 나오면 바꿔주는 작업을 해줘야 하는게 아닌가?? 라는 생각을 처음에 했다. 하지만 백트랙킹의 정의에 대해 다시 한번 생각해보자. 백트랙킹은 기본적으로 가능한 모든 경우의 수를 재귀적으로 작업하는 것이다!!

 

isIn[i] 를 true 에서 false로 바꿔주는 작업만 해줘도 모든 경우의 수 , 더 큰 자리의 선수가 나오는 경우도 계산이 가능하다는 것이다 !