문제
새로 배운 것
- 디버깅 단축키
- 무수한 재귀나 반복문으로 인해 단축키와 중단점만으로 해당 부분까지 가기 힘들 때, 그냥 변수에 해당 값을 직접 넣어서 돌려보자 ⇒ 훨씬 빠르게 확인 가능
제출 코드
- 순열(재귀)를 이용하여 문제 품
- 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);
}
}