[BOJ] 17281 - 야구
next_permutation을 사용한 문제다.
중요한 것은 배열을 넣어줄 때 마지막+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
#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
using namespace std;
int inning[55][9], sunser[8] = { 2,3,4,5,6,7,8,9 };
bool home[3];
int main(void) {
int n, ans = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++)
for (int j = 0; j < 9; j++)
scanf("%d", inning[i] + j);
do {
int tmp = 0, t_num = 0;
for (int i = 0; i < n; i++) { // 이닝 내에서의 게임
int out = 0;
memset(home, 0, sizeof(home)); // 이닝 시작시에는 비어있는 상태로 시작
while (out < 3) {
// now는 현재 타자가 낸 점수
int now = t_num == 3 ? inning[i][0] : // 4번타자(3)는 무조건 1번선수
t_num > 3 ? inning[i][sunser[t_num - 1] - 1] : // 5~9번타자(4~8): 각 3~7인덱스에 대응, 0~2는 그대로 대응
inning[i][sunser[t_num] - 1];
t_num = (t_num + 1) % 9;
if (now == 0) {
out++;
continue;
}
for (int i = 2; i >= 0; i--) { // home[0~2] : 1~3루에 주자가 존재하는지 여부
if (!home[i]) continue;
home[i] = false;
if (i + now >= 3) tmp++; // 홈에 도착하면 점수만 +1
else home[i + now] = true; // 루에 남는다.
}
if (now == 4) tmp++;
else home[now - 1] = true;
}
}
ans = max(ans, tmp);
} while (next_permutation(sunser, sunser + 8));
printf("%d", ans);
return 0;
}
This post is licensed under CC BY 4.0 by the author.
Comments powered by Disqus.