17281 ⚾

9으로 이루어진 팀이 야구를 한다.

타자가 공을 쳐서 얻을 수 있는 결과는 안타, 2루타, 3루타, 홈런, 아웃 중 하나이다.

  • 안타 : 타자와 모든 주자가 한 루씩 진루한다.
  • 2루타 : 타자와 모든 주자가 두 루씩 진루한다.
  • 3루타 : 타자와 모든 주자가 세 루씩 진루한다.
  • 홈런 : 타자와 모든 주자가 홈까지 진루한다.
  • 아웃 : 진루하지 못하고 아웃이 하나 증가한다.

3아웃이 되면 이닝이 바뀐다.

타순에서 4번타자는 1번 선수로 고정시킨다.

각 이닝 별로 선수가 어떤 결과를 얻을지 주어졌을 때 최고점수를 얻을 수 있는 타선을 찾고, 그 때의 득점을 구해보자.


풀이

  1. 각 이닝 별로 타자의 결과를 주어주기 때문에 2차원 배열을 생성한다.
    • new int[N][9]
  2. 타자가 타석에 들어섰을 때 결과를 계산하는 메소드를 구현한다. - score
    • 재귀로 아웃카운트가 3이되면 현재 이닝의 점수를 저장하고 리턴한다.
    • 다음 이닝에서는 다음 타자부터 타석에 들어가야하기 때문에 index를 전역변수에 저장한다.
  3. 모든 타순을 구하는 메소드를 구현한다.
    • 순열을 이용해서 타순을 구한다.
    • 파라미터에 타순을 저장할 배열을 넣고 4번째 값을 첫번째 타자로 초기화한다.
    • dfs를 사용해서 모든 타순을 구한다. (중간에 4번째 타순이면 continue)
    • 모든 타순이 정해졌다면 score로 점수를 구한다.
    • score에서 현재 타순의 타자를 구하는 것은 player[number[index % 9]]로 계속 순환하면서 찾을 수 있다.
  4. 최대값을 구한다.
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);
		}
	}
}

태그:

카테고리:

업데이트: