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


삼성A형 기출문제였고, 효율성을 고려하면 백준 환경에서 python 3으로는 사실상 풀 수 없는 문제.
1번 타자는 정해져 있고, 나머지 8명의 타자에게 타순을 부여하는 문제이므로
완전탐색이고, 총 탐색해야 할 가짓수는 8!으로 약 4만 개 정도다.
python3 설정으로는 시간초과를 절대 해결할 수 없었고, pypy3을 써도 정말 간신히 통과한다.
정말 어떻게 풀어도 시간초과가 해결이 안 나서, 검색으로 찾은 C++ 코드로 통과한 다음 pypy3 통과자들의 코드를 봤는데,
변수 할당 하나 때문에 91%에서 시간초과가 계속 났던 거였다.
원래는 base를 의미하는 b1, b2, b3도 배열로 선언한 다음 for문으로 체크하도록 코드를 짰었는데,
이 정도로 빡빡한 조건에서는 사치였다.
import sys | |
from itertools import permutations | |
end = int(sys.stdin.readline()) | |
inning = [list(map(int, sys.stdin.readline().split())) for _ in range(end)] | |
max_score = 0 | |
def game(line_ups): | |
hitter_idx = 0 | |
score = 0 | |
for each_inning in inning: | |
outcount = 0 | |
b1, b2, b3 = 0, 0, 0 | |
while outcount < 3: | |
# 이 변수 할당 하나가 시간초과를 만들었다. | |
# hit_type = each_inning[line_ups[hitter_idx]] | |
if each_inning[line_ups[hitter_idx]] == 0: | |
outcount += 1 | |
elif each_inning[line_ups[hitter_idx]] == 1: | |
score += b3 | |
b1, b2, b3 = 1, b1, b2 | |
elif each_inning[line_ups[hitter_idx]] == 2: | |
score += (b2 + b3) | |
b1, b2, b3 = 0, 1, b1 | |
elif each_inning[line_ups[hitter_idx]] == 3: | |
score += (b2 + b3 + b1) | |
b1, b2, b3 = 0, 0, 1 | |
elif each_inning[line_ups[hitter_idx]] == 4: | |
score += (1 + b1 + b2 + b3) | |
b1, b2, b3 = 0, 0, 0 | |
hitter_idx = (hitter_idx + 1) % 9 | |
return score | |
for line_ups in permutations(range(1,9), 8): | |
line_ups = list(line_ups[:3]) + [0] + list(line_ups[3:]) | |
max_score = max(max_score, game(line_ups)) | |
print(max_score) |
'프로그래밍 > 코딩테스트 문제풀이' 카테고리의 다른 글
[Python] 백준 2110. 공유기 설치 (0) | 2020.02.13 |
---|---|
[Python] 프로그래머스. 영어 끝말잇기 (Level 2) (0) | 2020.02.12 |
[Python] 백준 1021. 회전하는 큐 (0) | 2020.02.10 |
[Python] 프로그래머스. 예산 (Level 3) (0) | 2020.02.08 |
[Python] 백준 15997. 승부 예측 (카카오 코드페스티벌 2018) (0) | 2020.02.07 |