[백준] 17281번 ⚾️ (파이썬)

dongEon·2023년 4월 13일
0

난이도 : GOLD IV

문제링크 : https://www.acmicpc.net/problem/17281

문제해결 아이디어

  • 타순을 순열 라이브러리를 통해 전체 경우의 수를 비교한다.
  • 매 이닝마다 아웃카운트와 잔루를 초기화하고 이전 타자번호를 기억한다.
  • 베이스별로 진루
    • 안타일 경우 3루주자는 홈으로 2루주자는 3루로 1루주자는 2루로 1루는 주자가 존재한다.
    • 2루타일 경우 2,3루 주자 만큼 점수를 획득 이후 반복

소스코드

import sys
from itertools import permutations

input = sys.stdin.readline

n = int(input())

record = []

for _ in range(n):
    record.append(list(map(int, input().split())))
ans = 0
for seq in permutations([i for i in range(1, 9)], 8):
    seq = list(seq)
    seq.insert(3, 0)  # 타자 순열
    score = 0
    cur = 0 # 타자번호
    for time in range(n):  # n이닝
        out = base1 = base2 = base3 = 0 # 매 이닝 마다 아웃카운트, 베이스 초기화
        while out < 3:
            if record[time][seq[cur]] == 0:
                out += 1

            elif record[time][seq[cur]] == 1:
                score += base3
                base3 = base2
                base2 = base1
                base1 = 1

            elif record[time][seq[cur]] == 2:
                score += (base3 + base2)
                base3 = base1
                base2 = 1
                base1 = 0

            elif record[time][seq[cur]] == 3:
                score += (base3 + base2 + base1)
                base3 = 1
                base2 = 0
                base1 = 0
            else:
                score += (base3 + base2 + base1 + 1)
                base1 = base2 = base3 = 0

            cur = (cur + 1) % 9

    ans = max(ans,score)
print(ans)
profile
개발 중에 마주한 문제와 해결 과정, 새롭게 배운 지식, 그리고 알고리즘 문제 해결에 대한 다양한 인사이트를 공유하는 기술 블로그입니다

0개의 댓글