Home G17281. 야구
Post
Cancel

G17281. 야구

문제

image


새로 배운 것

  • 디버깅 단축키 image
  • 무수한 재귀나 반복문으로 인해 단축키와 중단점만으로 해당 부분까지 가기 힘들 때, 그냥 변수에 해당 값을 직접 넣어서 돌려보자 ⇒ 훨씬 빠르게 확인 가능


제출 코드

image


  • 순열(재귀)를 이용하여 문제 품
  • 3일에 걸쳐 풀었다. 오래 걸린 이유
    • 야구 룰 이해를 잘못함 (출루한 선수들이 밀려나서 1점씩 점수 얻는 것을 생각 못함)
    • 재귀 함수 적는데 오래걸림


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package gold;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class G17281_baseball {
	static int N;
	static int sum;
	static int max = 0;
	static boolean[] ground = new boolean[3];
	static boolean[] selected = new boolean[9];
	static int[] order = new int[9];
	static int[][] ining;

	/* 정해진 타석순대로 게임을 진행
	 * - in : 이닝 인덱스
	 * - n : 이닝 시작 시 첫번째로 들어가는 타석index
	 */
	static void playGame(int in, int n) {
		ground[0]=false; ground[1]=false; ground[2]=false;

		if(in==N) {
			max = Math.max(max, sum);
			return;
		}

		int out = 0, score;
		while(out < 3) {
			score = ining[in][order[n]];
			if(score==0) {		//case1. 아웃
				out++;
			}else {
				//출루한 선수 체크
				for(int i=2; i>=0; i--) {
					if(ground[i]) {
						if(i+score > 2) {
							sum++;
						}else {
							ground[i+score] = true;
						}
						ground[i]=false;
					}
				}
				if(score==4) {	//case2. 홈런
					sum++;
				}else {			//case3. 안타
					ground[score-1]=true;
				}
			}
			n = (n+1)%9;
		}
		playGame(in+1, n);
	}

	/* 모든 타석의 경우를 순열로 계산
	 * - n : 선수를 채울 타석 번호
	 */
	static void permutation(int n) {
		if(n==3) {	// 4번타자는 내정됨
			order[n] = 0;
			selected[0] = true;
			permutation(n+1);
			return;
		}
		if(n==9) {	// 모든 타석 선발완료
			sum = 0;
			playGame(0, 0);
			return;
		}

		// 순열 생성
		for(int i=1; i<9; i++) {
			if(!selected[i]) {
				selected[i] = true;
				order[n]=i;
				permutation(n+1);

				selected[i] = false;
			}
		}

	}

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		N = Integer.parseInt(br.readLine());
		ining = new int[N][9];

		for(int i=0; i<N; i++) {
			ining[i] = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
		}

		order[3] = 0;
		permutation(0);

		System.out.println(max);

	}

}
This post is licensed under CC BY 4.0 by the author.