백준 17281. ⚾
2023. 4. 16. 22:16ㆍ알고리즘/백준
17281번: ⚾
⚾는 9명으로 이루어진 두 팀이 공격과 수비를 번갈아 하는 게임이다. 하나의 이닝은 공격과 수비로 이루어져 있고, 총 N이닝 동안 게임을 진행해야 한다. 한 이닝에 3아웃이 발생하면 이닝이 종
www.acmicpc.net
입력
- 첫째 줄에 이닝 수 N(2 ≤ N ≤ 50)이 주어진다.
- 둘째 줄부터 N개의 줄에 각 선수가 각 이닝에서 얻는 결과가 순서대로 주어진다.
문제 풀이
- 가능한 타순의 결과를 모두 비교해야 최대 점수를 확실하게 구할 수 있다.
- 먼저 순열을 이용하여 타순을 구한 후 각 타순이 정해졌을 때 점수를 구해 비교한다.
import sys
from itertools import permutations
input = sys.stdin.readline
def game(N, lst):
score = 0
st = 0
for i in range(N): # 입력 받은 이닝 수만큼 진행
out = 0 # 아웃 카운트
b1, b2, b3 = 0, 0, 0 # 1루, 2루, 3루(사람있으면 1, 없으면 0)
while 1:
if out == 3: # 아웃카운트 3이면 다음 이닝
break
if inning[i][lst[st]] == 0: # 아웃이면
out += 1 # 아웃카운트 +1
elif inning[i][lst[st]] == 1: # 1루타
score += b3 # 3루에 사람있으면 +1, 아니면 +0
b1, b2, b3 = 1, b1, b2
elif inning[i][lst[st]] == 2: # 2루타
score += b2 + b3 # 2루, 3루에 있는 사람수만큼 점수 +
b1, b2, b3 = 0, 1, b1
elif inning[i][lst[st]] == 3: # 3루타
score += b1 + b2 + b3
b1, b2, b3 = 0, 0, 1
else: # 홈런
score += b1 + b2 + b3 + 1
b1, b2, b3 = 0, 0, 0
st = (st + 1)%9
return score
N = int(input())
inning = [0]*N
maxx = 0
visited = [0]*9
for i in range(N):
inning[i] = [*map(int, input().split())]
for arr in permutations(range(1,9), 8): # 2번 선수부터 9번 선수까지 순서(순열)
arr = list(arr[:3]) + [0] + list(arr[3:]) # 4번 타자는 1번 선수로 고정
maxx = max(game(N, arr), maxx)
print(maxx)
- permutations를 이용하여 순열을 구현했는데, dfs를 사용하여 순열을 구하면 시간 초과가 난다.

'알고리즘 > 백준' 카테고리의 다른 글
| 백준 17471. 게리맨더링(python) (0) | 2023.05.08 |
|---|---|
| 백준 2116. 주사위 쌓기(python) (1) | 2023.05.01 |
| 백준 17472. 다리 만들기 2(python) (0) | 2023.04.23 |
| 백준 4991. 로봇 청소기(python) (0) | 2023.04.16 |