17281번: ⚾
⚾는 9명으로 이루어진 두 팀이 공격과 수비를 번갈아 하는 게임이다. 하나의 이닝은 공격과 수비로 이루어져 있고, 총 N이닝 동안 게임을 진행해야 한다. 한 이닝에 3아웃이 발생하면 이닝이 종
www.acmicpc.net
코드
from itertools import permutations
import sys
input = sys.stdin.readline
n = int(input())
result = [list(map(int, input().split())) for _ in range(n)]
ans = 0
for comb in permutations(range(1, 9), 8):
comb = list(comb)
order = comb[:3]+[0]+comb[3:] # 타순
score = 0
idx = 0
for i in range(n): # 이닝
b1, b2, b3 = 0, 0, 0 # 1, 2, 3루 주자 현황
out = 0 # 아웃 개수
while out < 3:
player = order[idx]
if result[i][player] == 0: # 아웃
out += 1
elif result[i][player] == 1: # 안타
score += b3
b1, b2, b3 = 1, b1, b2
elif result[i][player] == 2: # 2루타
score += (b2+b3)
b1, b2, b3 = 0, 1, b1
elif result[i][player] == 3: # 3루타
score += (b1+b2+b3)
b1, b2, b3 = 0, 0, 1
else: # 홈런
score += (b1+b2+b3+1)
b1, b2, b3 = 0, 0, 0
idx = (idx+1) % 9 # 다음 타자로
if ans < score:
ans = score
print(ans)
항상 9명의 선수이고, 1번 선수는 4번 타자로 고정되어 있으므로 나머지 선수들의 순서를 순열로 구하여 각 경우에 대해 몇 점이 나오는지 계산하면 된다. 문제 자체는 어렵지 않으나 시간 초과 때문에 어려웠다. 위의 코드도 PyPy3로만 통과한다.
처음에는 1, 2, 3루의 주자 현황을 3행 배열로 저장했었지만 이렇게 하면 어떻게 해도 시간 초과가 발생해서 3개의 변수로 나눴더니 시간 초과를 해결할 수 있었다.
'문제풀이 > 구현' 카테고리의 다른 글
[Python/파이썬] 백준 21277번 짠돌이 호석 (0) | 2024.04.06 |
---|---|
[Python/파이썬] 백준 14499번 주사위 굴리기 (1) | 2024.03.31 |
[Python/파이썬] 백준 1652번 누울 자리를 찾아라 (0) | 2024.03.12 |
[Python/파이썬] 백준 6986번 절사평균 (0) | 2024.03.02 |
[Python/파이썬] 백준 16472번 고냥이 (0) | 2024.02.26 |