chldkato

백준 17281 ⚾ (파이썬) 본문

백준

백준 17281 ⚾ (파이썬)

chldkato 2020. 4. 24. 16:52

https://www.acmicpc.net/problem/17281

 

17281번: ⚾

⚾는 9명으로 이루어진 두 팀이 공격과 수비를 번갈아 하는 게임이다. 하나의 이닝은 공격과 수비로 이루어져 있고, 총 N이닝동안 게임을 진행해야 한다. 한 이닝에 3아웃이 발생하면 이닝이 종료되고, 두 팀이 공격과 수비를 서로 바꾼다. 두 팀은 경기가 시작하기 전까지 타순(타자가 타석에 서는 순서)을 정해야 하고, 경기 중에는 타순을 변경할 수 없다. 9번 타자까지 공을 쳤는데 3아웃이 발생하지 않은 상태면 이닝은 끝나지 않고, 1번 타자가 다시 타석에

www.acmicpc.net

1. 타순에 대한 리스트 select와 중복을 검사할 리스트 c를 만든다

   1번 타자는 4번 타순으로 이미 정해져있기 때문에 select[3]은 0, c[3]은 1로 미리 정해둔다

2. dfs 순열로 모든 타순에 대한 점수를 구한다

3. 타순이 정해지면 타석에 들어갈 선수를 알려주는 변수 start와 점수를 저장할 score를 만든다

4. 매 이닝마다 아웃카운트 out과 루에 있는지 확인할 변수 b1~b3를 초기화한다

5. 아웃카운트가 3이 될 때까지 타순을 이어나간다

   만약 타석에 들어간 선수가 할 행동이 0 이면 out을 증가시킨다

   1~4이면 각 숫자에 맞게 점수를 증가시키고 b1~b3을 갱신한다

6. start를 증가시키고 9로 나눈 나머지로 갱신한다

7. 모든 이닝이 끝나면 최대값을 갱신한다

import sys

input = sys.stdin.readline

def dfs(cnt):
    global ans
    if cnt == 9:
        start, score = 0, 0
        for inning in a:
            out, b1, b2, b3 = 0, 0, 0, 0
            while out <= 2:
                p = select[start]
                if inning[p] == 0:
                    out += 1
                elif inning[p] == 1:
                    score += b3
                    b1, b2, b3 = 1, b1, b2
                elif inning[p] == 2:
                    score += b2 + b3
                    b1, b2, b3 = 0, 1, b1
                elif inning[p] == 3:
                    score += b1 + b2 + b3
                    b1, b2, b3 = 0, 0, 1
                else:
                    score += b1 + b2 + b3 + 1
                    b1, b2, b3 = 0, 0, 0

                start += 1
                start %= 9

        ans = max(ans, score)
        return

    for i in range(9):
        if c[i]:
            continue
        c[i] = 1
        select[i] = cnt
        dfs(cnt + 1)
        c[i] = 0
        select[i] = 0


n = int(input())
a = [list(map(int, input().split())) for _ in range(n)]
select, c = [0 for _ in range(9)], [0 for _ in range(9)]
select[3], c[3] = 0, 1
ans = 0
dfs(1)
print(ans)

Comments