[BOJ] Q17281 야구
[BOJ] Q17281 야구
Question
Language: Python
Difficulty: Gold 4
모든 경우에 대해 조사하는 bruteforce 유형의 문제이다.
4번 타자를 제외한 나머지 타순은 모두 랜덤이므로, permutation을 이용해서 타순을 지정한다.
for permutation in permutations([1,2,3,4,5,6,7,8]):
batter_orders=list(permutation)
batter_orders.insert(3,0)
그런 각 이닝 별로 1루타,2루타,3루타,홈런,아웃을 처리한다.
#1루타:
score+=base3
base1,base2,base3=1,base1,base2
#2루타:
score+=(base2+base3)
base1,base2,base3=0,1,base1
#3루타:
score+=(base1+base2+base3)
base1,base2,base3=0,0,1
#홈런 --> 모두 출루
score+=(base1+base2+base3+1)
base1,base2,base3=0,0,0
#아웃:
outs+=1
주의사항
이때, 처음에는 base를 deque()로 관리해서 매번 appendleft/pop을 반복했는데, 이렇게 되면 삽입/삭제가 너무 빈번하게 발생하여 반복횟수가 증가하게 된다.
따라서, base1,base2,base3와 같이 관리하여 효율적으로 진루 처리를 할 수 있다.
Solution
from itertools import permutations
from collections import deque
def solution():
max_score=0
for permutation in permutations([1,2,3,4,5,6,7,8]):
batter_orders=list(permutation)
#4번 타자
batter_orders.insert(3,0)
#점수
score=0
#다음 타순
next_index=0
#이닝
for i in range(N):
#루
base1,base2,base3=0,0,0
#아웃
outs=0
#out이 3번이 될때 까지 타순 반복
while outs < 3:
option=players[i][batter_orders[next_index]]
#1루타:
if option==1:
score+=base3
base1,base2,base3=1,base1,base2
#2루타:
elif option==2:
score+=(base2+base3)
base1,base2,base3=0,1,base1
#3루타:
elif option==3:
score+=(base1+base2+base3)
base1,base2,base3=0,0,1
#홈런 --> 모두 출루
elif option==4:
score+=(base1+base2+base3+1)
base1,base2,base3=0,0,0
#아웃:
else:
outs+=1
#다음 타선
next_index=(next_index+1)%9
max_score=max(max_score,score)
return max_score
if __name__ == "__main__":
N=int(input())
players=[list(map(int,input().split())) for _ in range(N)]
print(solution())
댓글남기기