Programming Languages/Python
[백준] 17281번: 야구 (Python/파이썬)
minjiwoo
2022. 12. 24. 09:56
728x90
https://www.acmicpc.net/problem/17281
17281번: ⚾
⚾는 9명으로 이루어진 두 팀이 공격과 수비를 번갈아 하는 게임이다. 하나의 이닝은 공격과 수비로 이루어져 있고, 총 N이닝 동안 게임을 진행해야 한다. 한 이닝에 3아웃이 발생하면 이닝이 종
www.acmicpc.net
1. 선수 조합 : permutations 내장 라이브러리로 모든 경우의 수를 구하고 brute force로 확인한다.
2. 점수계산 : 야구의 규칙이해가 바탕이 되어야 했다.. 그래서 어려웠다 ㅎㅎ ㅜㅜ
안타 -> 타자는 1루, 1루에 있던 선수는 2루, 2루에 있던 선수는 3루, 3루에 있던 선수는 홈으로 score += three
2루타 -> 타자는 2루로 진출, 1루에 있던 선수는 3루, 2루에 있던 선수는 홈, 3루에 있던 선수는 홈으로 간다.
1루는 비게 되므로 0으로 초기화 한다.
따라서 score += two + three
3루타 ->
1루, 2루, 3루에 있던 선수는 홈까지 간다.
타자는 3루로 진출, 1루와 2루는 비게 되므로 0으로 초기화 한다.
score += one + two + three
홈런 ->
모든 선수들이 홈까지 진출하므로 score += three + two + one + 1
선수들이 홈으로 모두 진출했으므로, 1루, 2루, 3루는 모두 비게 된다. 따라서 0으로 초기화한다.
여기서 1은 현재 타자까지 홈까지 진출한다는 의미임.
from itertools import permutations
import sys
input = sys.stdin.readline
n = int(input())
max_point = 0
innings = [] # 이닝 전체 정보
for _ in range(n):
innings.append(list(map(int, input().split()))) # 타자 9명의
def play_game(player_order):
score = 0
p = 0 # now player
for i in range(n): # inning 수 만큼 반복하기
out = 0 # out 수
one = 0 # 안타
two = 0 # 2루타
three = 0 # 3루타
while out < 3:
if innings[i][player_order[p]] == 0:
out += 1
elif innings[i][player_order[p]] == 1:
score += three # 3루 종료
three = two
two = one
one = 1
elif innings[i][player_order[p]] == 2:
score += two + three
three = one
two = 1 # 타자는 2루까지 진출
one = 0
elif innings[i][player_order[p]] == 3:
score += three + two + one
one, two, three = 0, 0, 1 # 타자는 3루까지 진출
elif innings[i][player_order[p]] == 4: # 모든 주자가 홈까지 진루한다
score += 1 + one + two + three
one, two, three = 0, 0, 0
p = (p + 1) %9 # player 다음 인덱스로 변경
return score
# 0 번 제외, 1 ~ 8 에 대한 순열 조합 구하기
for player in permutations(range(1, 9), 8):
player_order = list(player[:3])+ [0] + list(player[3:])
max_point = max(play_game(player_order), max_point)
print(max_point)
728x90