상세 컨텐츠

본문 제목

[백준 17281번] 야구공(파이썬)

알고리즘 공부

by Tabris4547 2022. 8. 9. 09:27

본문

728x90

https://www.acmicpc.net/problem/17281

 

17281번: ⚾

⚾는 9명으로 이루어진 두 팀이 공격과 수비를 번갈아 하는 게임이다. 하나의 이닝은 공격과 수비로 이루어져 있고, 총 N이닝 동안 게임을 진행해야 한다. 한 이닝에 3아웃이 발생하면 이닝이 종

www.acmicpc.net

야구게임을 구현하는 문제입니다.

이 문제에서 포인트는 이렇게 됩니다.

 

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로 제출하니 통과가 되었습니다.

선수들의 순번을 유지시키면서

이닝을 넘기는 부분이 공부하기 좋은 포인트입니다.

728x90

관련글 더보기

댓글 영역