https://www.acmicpc.net/problem/17281
야구게임을 구현하는 문제입니다.
이 문제에서 포인트는 이렇게 됩니다.
1. 선수들 케이스 구하기
2. 선수들 순서 유지하면서 이닝넘어가기
3. 아웃~홈런 구현하기
1-->permutation으로 1~8번째의 케이스를 구해줍니다.
그 후, 각 케이스를 리스트로 만든 뒤
(permutation,combination의 결과값은
tuple이 되므로
list로 전환시켜줘야함)
insert(3,0)으로 4번째타자는 1번타자(0번째)로 만들어줍니다.
2-->이 부분이 생각하기 힘들었습니다.
저는 while문을 만들었습니다.
while문은 inning이 N보다 작을때까지 작동합니다.
선수들의 순서는 player라는 변수로 두고
순서를 계속 돌려줍니다.
out==3이 되면
inning을 올려주고
base와 out은 초기화되지만
선수는 초기화시키지 않으므로
다음 이닝이 되었을 때
다음번 순번의 선수가 공을 치는 게 됩니다.
3-->이건 직접 하나 하나 다 구현했습니다.
#백준 17281번 야구공
from itertools import permutations
N=int(input())
result=[list(map(int,input().split())) for _ in range(N)]
c=[1,2,3,4,5,6,7,8]
c_m=permutations(c,8)
answer=0
for ball in c_m:
score=0
#선수들 순서를 구함
case=list(ball)
case.insert(3,0)
inning=0
out=0
player=0
base=[0,0,0]
while inning<N:
n_p=case[player]
now=result[inning][n_p]
#아웃
if now==0:
out+=1
#안타
elif now==1:
if base[2]==1:
score+=1
base[2]=0
if base[1]==1:
base[1]=0
base[2]=1
if base[0]==1:
base[0]=0
base[1]=1
base[0]=1
#2루타
elif now==2:
if base[2]==1:
score+=1
base[2]=0
if base[1]==1:
base[1]=0
score+=1
if base[0]==1:
base[0]=0
base[2]=1
base[1]=1
#3루타
elif now==3:
if base[2]==1:
score+=1
base[2]=0
if base[1]==1:
base[1]=0
score+=1
if base[0]==1:
base[0]=0
score+=1
base[2]=1
#홈런
elif now==4:
if base[2]==1:
score+=1
base[2]=0
if base[1]==1:
base[1]=0
score+=1
if base[0]==1:
base[0]=0
score+=1
score+=1
player=(player+1)%9
if out==3:
inning+=1
base=[0,0,0]
out=0
answer=max(answer,score)
print(answer)
컴퓨터로 할 때
시간이 다소 걸리는 느낌이라
시간초과가 뜰 줄 알았으나
pypy3로 제출하니 통과가 되었습니다.
선수들의 순번을 유지시키면서
이닝을 넘기는 부분이 공부하기 좋은 포인트입니다.
[백준 20327번] 배열 돌리기6(파이썬) (1) | 2022.08.15 |
---|---|
[백준 17406번] 배열돌리기 4(파이썬) (2) | 2022.08.11 |
[백준 17135번] 캐슬 디펜스 (파이썬) (1) | 2022.08.08 |
[백준 17070번] 파이프 옮기기 1(파이썬) (0) | 2022.08.05 |
[백준 16637번] 괄호 추가하기(파이썬) (0) | 2022.08.02 |
댓글 영역