17281 ⚾
9으로 이루어진 팀이 야구를 한다.
타자가 공을 쳐서 얻을 수 있는 결과는 안타, 2루타, 3루타, 홈런, 아웃 중 하나이다.
- 안타 : 타자와 모든 주자가 한 루씩 진루한다.
- 2루타 : 타자와 모든 주자가 두 루씩 진루한다.
- 3루타 : 타자와 모든 주자가 세 루씩 진루한다.
- 홈런 : 타자와 모든 주자가 홈까지 진루한다.
- 아웃 : 진루하지 못하고 아웃이 하나 증가한다.
3아웃이 되면 이닝이 바뀐다.
타순에서 4번타자는 1번 선수로 고정시킨다.
각 이닝 별로 선수가 어떤 결과를 얻을지 주어졌을 때 최고점수를 얻을 수 있는 타선을 찾고, 그 때의 득점을 구해보자.
풀이
- 각 이닝 별로 타자의 결과를 주어주기 때문에 2차원 배열을 생성한다.
new int[N][9]
- 타자가 타석에 들어섰을 때 결과를 계산하는 메소드를 구현한다. -
score
- 재귀로 아웃카운트가 3이되면 현재 이닝의 점수를 저장하고 리턴한다.
- 다음 이닝에서는 다음 타자부터 타석에 들어가야하기 때문에 index를 전역변수에 저장한다.
- 모든 타순을 구하는 메소드를 구현한다.
- 순열을 이용해서 타순을 구한다.
- 파라미터에 타순을 저장할 배열을 넣고 4번째 값을 첫번째 타자로 초기화한다.
- dfs를 사용해서 모든 타순을 구한다. (중간에 4번째 타순이면 continue)
- 모든 타순이 정해졌다면
score
로 점수를 구한다. score
에서 현재 타순의 타자를 구하는 것은player[number[index % 9]]
로 계속 순환하면서 찾을 수 있다.
- 최대값을 구한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main야구공 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
player = new int[N][9];
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < 9; j++) {
player[i][j] = Integer.parseInt(st.nextToken());
}
}
Max = 0;
int[] number = new int[9];
number[3] = 0;
power(1, number, new boolean[9]);
System.out.println(Max);
}
static int thisScore;
static int index;
static int[][] player;
static int N;
static int Max;
static void power(int idx, int[] number, boolean[] visited) {
if (idx == 9) {
int ans = 0;
index = 0;
for (int i = 0; i < N; i++) {
thisScore = 0;
score(new int[4], player[i], number, 0, 0);
ans += thisScore;
}
Max = Math.max(ans, Max);
return;
}
for (int i = 0; i < 9; i++) {
if (i == 3)
continue;
if (!visited[i]) {
number[i] = idx;
visited[i] = true;
power(idx + 1, number, visited);
visited[i] = false;
}
}
}
// base는 1,2,3루
static void score(int[] base, int[] player, int[] number, int outCnt, int sum) {
if (outCnt == 3) {
thisScore += sum;
return;
}
if (player[number[index % 9]] == 0) {
outCnt++;
index++;
score(base, player, number, outCnt, sum);
}
else if (player[number[index % 9]] == 1) {
if (base[3] == 1) {
sum++;
}
base[3] = base[2];
base[2] = base[1];
base[1] = 1;
index++;
score(base, player, number, outCnt, sum);
}
else if (player[number[index % 9]] == 2) {
if (base[3] == 1) {
sum++;
}
if (base[2] == 1) {
sum++;
}
base[3] = base[1];
base[2] = 1;
base[1] = 0;
index++;
score(base, player, number, outCnt, sum);
}
else if (player[number[index % 9]] == 3) {
if (base[3] == 1) {
sum++;
}
if (base[2] == 1) {
sum++;
}
if (base[1] == 1) {
sum++;
}
base[2] = base[1] = 0;
base[3] = 1;
index++;
score(base, player, number, outCnt, sum);
}
else if (player[number[index % 9]] == 4) {
if (base[3] == 1) {
sum++;
}
if (base[2] == 1) {
sum++;
}
if (base[1] == 1) {
sum++;
}
sum++;
index++;
base[3] = base[2] = base[1] = 0;
score(base, player, number, outCnt, sum);
}
}
}