728x90
https://www.acmicpc.net/problem/17281
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
'Programming Languages > Python' 카테고리의 다른 글
[백준] 1022번: 소용돌이 예쁘게 출력하기 Python (0) | 2023.03.14 |
---|---|
[Python] 2차원 배열 90도 회전하기 (시계방향) (0) | 2023.01.13 |
[Python] ATM 프로그램/은행 프로그램 파이썬으로 만들기 (파일 입출력으로 데이터 저장) (0) | 2022.11.10 |
Python k 진수로 바꾸기 (0) | 2022.09.30 |
python re.sub - 정규화표현식으로 문자열 바꿔주기 (1) | 2022.09.11 |