문제링크 : https://www.acmicpc.net/problem/17281
import java.io.*;
import java.util.*;
public class BJ17281HJ {
static int n, ans;
static int[] players = {0, 1, 2, 3, 4, 5, 6, 7, 8};
static int[] order = new int[9];
static boolean[] visit = new boolean[9];
static int[][] arr;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
arr = new int[n][9];
for (int i=0; i<n; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j=0; j<9; j++){
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
permPlayer(players, order, visit, 0, 9);
System.out.println(ans);
}
static void permPlayer(int[] players, int[] order, boolean[] visit, int depth, int r){
// 4번타자가 1번인 경우에만 함수 실행
if (depth == r && order[3] == 0){
int gameScore = playGame(order);
ans = Math.max(ans, gameScore);
return;
}
for (int i=0; i<9; i++){
if (!visit[i]){
visit[i] = true;
order[depth] = players[i];
permPlayer(players, order, visit, depth+1, r);
visit[i] = false;
}
}
}
static int playGame(int[] order){
// Now : 현재 선수 번호, sum : 게임이 끝난 후 점수의 합
int now = 0; int sum = 0;
for (int game = 0; game<n; game++){
// score : 이닝 당 점수
int score = 0; int outCount = 0;
boolean[] base = new boolean[4];
while (outCount<3){
switch (arr[game][order[now]]){
case 0:
outCount++;
break;
case 1:
if (base[3]){
score ++;
base[3] = false;
}
if (base[2]){
base[3] = true;
base[2] = false;
}
if (base[1]){
base[2] = true;
}
base[1] = true;
break;
case 2:
if (base[3]){
score ++;
base[3] = false;
}
if (base[2]){
score++;
}
if (base[1]){
base[3] = true;
base[1] = false;
}
base[2] = true;
break;
case 3:
if (base[3]){
score ++;
}
if (base[2]){
score ++;
base[2] = false;
}
if (base[1]){
score ++;
base[1] = false;
}
base[3] = true;
break;
case 4:
if (base[3]){
score ++;
base[3] = false;
}
if (base[2]){
score ++;
base[2] = false;
}
if (base[1]){
score++;
base[1] = false;
}
score ++;
break;
}
now ++;
if (now>=9){
now = 0;
}
}
sum += score;
}
return sum;
}
}
풀이 :
1. 순열을 이용하여 선수 순서 정하기
2. 순서가 정해진 후, 4번 타자가 1번선수일때만 (idx=0) playGame 함수를 실행
3. base = new boolean[4]; 를 통해 베이스마다 선수가 있는지 없는지 t/f 로 판별
4. switch~case 문으로 상황에 따라 조건 처리
'Algorithm > Java' 카테고리의 다른 글
[백준] 8979 올림픽 (0) | 2024.04.11 |
---|---|
[백준] 14719 빗물 (1) | 2024.04.10 |
[백준] 1864 스카이라인 쉬운거 (0) | 2024.04.08 |
[백준] 2146 다리 만들기 (0) | 2024.03.25 |
[백준] 14658 하늘에서 별똥별이 빗발친다 (0) | 2024.03.14 |