백준 17281번 ⚾(야구공)

#17281. ⚾

Problem

Solution

시뮬레이션 문제이다. 문제의 설명에 맞게 잘 구현하면 큰 어려움은 없는 문제

  1. 타자의 순번을 정한다. (1번 선수는 4번 타자로 고정) → (1, 2, 3)과 (2, 1, 3)은 다른 순서임
  2. 1이닝부터 N이닝까지 경기를 진행한다.
  3. 각 이닝별 진행 흐름
    1. 이전 순번 바로 다음부터 순번이 진행된다. (첫 이닝은 1번부터(인덱스상 0))
    2. 아웃이 3번이 될 때까지 진행한다.
    3. 1루, 2루, 3루에 선수가 있는지 표시하는 is_there 변수를 사용하여 진행한다.

1 Try

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
#include <iostream>
using namespace std;
int N, ans;
int info[50][9]; // 각 이닝별 타자 정보
int order[9]; // 타자 순번
bool selected[9];
void Game() {
int idx = 0, score = 0; // 순번 인덱스, 현재 점수
for(int inning = 0; inning < N; ++inning) {
bool is_there[3] = { false, false, false }; // 1, 2, 3루
int out = 0;
while (true) {
if (info[inning][order[idx]] == 0) { // 아웃
out++;
}
else if (info[inning][order[idx]] == 1) { // 1루타
if (is_there[2]) { // 3루타 -> 홈
score++; is_there[2] = false;
}
for (int i = 1; i != -1; --i) { // 각각 1 전진
if (is_there[i]) {
is_there[i + 1] = true;
is_there[i] = false;
}
}
is_there[0] = true; // 1루 전진
}
else if (info[inning][order[idx]] == 2) { // 2루타
for (int i = 1; i < 3; ++i) { // 2루, 3루 -> 홈
if (is_there[i]) {
score++; is_there[i] = false;
}
}
if (is_there[0]) { // 1루 -> 3루
is_there[2] = true; is_there[0] = false;
}
is_there[1] = true; // 2루 전진
}
else if (info[inning][order[idx]] == 3) { // 3루타
for (int i = 0; i < 3; ++i) { // 1, 2, 3루 -> 홈
if (is_there[i]) {
score++; is_there[i] = false;
}
}
is_there[2] = true; // 3루 전진
}
else { // 홈런
for (int i = 0; i < 3; ++i) {
if (is_there[i]) {
score++; is_there[i] = false;
}
}
score++;
}
idx = (idx + 1) % 9; // 다음 순번
if (out == 3) break; // 3진 아웃
}
}
if (ans < score) ans = score;
}
void SelectOrder(int cnt) {
if (cnt == 9) {
Game();
return;
}
if (cnt == 3) cnt++;
for (int i = 1; i < 9; ++i) {
if (selected[i]) continue;
selected[i] = true;
order[cnt] = i;
SelectOrder(cnt + 1);
selected[i] = false;
}
}
int main() {
cin >> N;
for (int i = 0; i < N; ++i) {
for (int j = 0; j < 9; ++j) {
cin >> info[i][j];
}
}
selected[0] = true; order[3] = 0; // 1번 선수 4번째 고정
SelectOrder(0);
cout << ans << "\n";
return 0;
}