본문 바로가기
Problem Solving/백준

백준 3980 : 선발 명단

by Libi 2021. 7. 17.
반응형

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

 

3980번: 선발 명단

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

www.acmicpc.net

[ 문제풀이 ]

선수가 11명이고 선수당 적합한 포지션의 수가 최대 5밖에 안되기 때문에 백트래킹을 통해 모든 경우를 탐색해주면 된다.

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

public class Main {
	
	static int max;
	static int[][] s;
	static boolean[] visit;
	
	public static void main(String[] args) throws IOException {
		try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
				BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out))){
			int C = Integer.parseInt(br.readLine());
			s = new int[11][11];
			visit = new boolean[11];
			while (C-- > 0) {
				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());
					}
				}
				dfs(0, 0);
				bw.write(max + "\n");
				Arrays.fill(visit, false);
				max = 0;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void dfs(int y, int v) {
		if (y == 11) {
			max = Math.max(max, v);
			return;
		}
		
		for (int i = 0; i < 11; ++i) {
			if (visit[i] || s[y][i] == 0) continue;
			visit[i] = true;
			dfs(y + 1, v + s[y][i]);
			visit[i] = false;
		}
	}
}
반응형

'Problem Solving > 백준' 카테고리의 다른 글

백준 20040 : 사이클 게임  (0) 2021.07.20
백준 11812 : K진 트리  (0) 2021.07.19
백준 9935 : 문자열 폭발  (0) 2021.07.16
백준 3151 : 합이 0  (0) 2021.07.12
백준 1781 : 컵라면  (0) 2021.07.11

댓글