주어진 N 이닝 동안 게임을 진행
한 이닝에 3아웃이 발생하면 이닝은 종료
모든 이닝을 시작하기 전 순서는 정해지고 나중에 바꿀 수 없다.
만약 1번 타자부터 9번 타자까지 모든 타자가 공을 다 쳤는데도 3아웃이 발생하지 않았다면 이닝은 종료되지 않고 1번 타자부터 3아웃할 때까지 계속 진행한다.
3아웃 발생 시 전 이닝의 마지막 타자 다음 타자가 다음 이닝의 첫 타자가 된다.
ex) 2 이닝에 6번 타자가 마지막 타자 -> 3 이닝에 7번 타자가 첫 타자
타자가 공을 쳐서 얻을 수 있는 결과는 안타, 2루타, 3루타, 홈런, 아웃 중 하나이다. 각각이 발생했을 때, 벌어지는 일은 다음과 같다.
아인타는 자신이 가장 좋아하는 선수인 1번 선수를 4번 타자로 미리 결정했다. 이제 다른 선수의 타순을 모두 결정해야 한다. 아인타는 각 선수가 각 이닝에서 어떤 결과를 얻는지 미리 알고 있다. 가장 많은 득점을 하는 타순을 찾고, 그 때의 득점을 구해보자.
첫째 줄에 이닝 수 N(2 ≤ N ≤ 50)이 주어진다. 둘째 줄부터 N개의 줄에는 각 선수가 각 이닝에서 얻는 결과가 1번 이닝부터 N번 이닝까지 순서대로 주어진다. 이닝에서 얻는 결과는 9개의 정수가 공백으로 구분되어져 있다. 각 결과가 의미하는 정수는 다음과 같다.
아인타팀이 얻을 수 있는 최대 점수를 출력한다.
야알못이라 문제를 이해하는데 꽤 오래걸렸던 같다.
예제 입력 3번을 설명해보자면,
2
0 4 4 4 4 4 4 4 4
0 4 4 4 4 4 4 4 4
1번 선수는 항상 4번 타자로 들어가기 때문에, 2, 3, 4, 1, 5, 6, 7, 8, 9
의 경우를 생각해보면 된다.
이 순서대로 이닝 결과를 다시 나열해 보면,
4 4 4 0 4 4 4 4 4
가 되고
1 이닝에서 3 아웃될 때까지의 점수는 8 + 8 + 3(3아웃 전까지 계산) = 19가 되고
2 이닝은 5번 타자가 첫 타자가 되므로 8 + 8 + 8 = 24가 되므로 총 43점이 된다.
처음에는 deque로 maxlen=3을 고정해두고 풀이하였으나 시간 초과가 나서 배열로 바꾸어 풀었다ㅠㅠ pop()하고 appendleft()를 여러번 하게 되니 당연한 결과인 것 같다..
import sys
from itertools import permutations
input = sys.stdin.readline
N = int(input()) # 이닝 수
results = [list(map(int, input().split())) for _ in range(N)]
# 0번(1번)은 4번 타자 고정
answer = 0
for order in list(permutations([1, 2, 3, 4, 5, 6, 7, 8], 8)):
order = list(order)[:3] + [0] + list(order)[3:]
cnt = 0 # 홈으로 나간 선수들 수 + 1
idx = 0 # 매 이닝 마다 첫 타자
for result in results: # 이닝마다 예측한 결과들
base = [0, 0, 0] # 타자가 있는 위치에는 1 없으면 0
out = 0 # 3이 되면 이닝 종료, 이닝마다 리셋
while out < 3:
hitter = order[idx] # 현재 타자, result[hitter]는 현재 타자의 이닝 결과
idx = (idx + 1) % 9
if result[hitter] == 0: # 아웃
out += 1
elif result[hitter] == 1: # 안타
cnt += base[2]
base[0], base[1], base[2] = 1, base[0], base[1]
elif result[hitter] == 2: # 2루타
cnt += (base[2] + base[1])
base[0], base[1], base[2] = 0, 1, base[0]
elif result[hitter] == 3: # 3루타
cnt += (base[0] + base[1] + base[2])
base = [0, 0, 1]
elif result[hitter] == 4: #홈런
cnt += (base[0] + base[1] + base[2] + 1)
base = [0, 0, 0]
answer = max(answer, cnt)
print(answer)