Post

[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.