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