본문 바로가기

백준

[파이썬] 백준 17215 볼링 점수 계산

http://mazassumnida.wtf/api/generate_badge?boj=swoon

먼저 규칙이 주어져있는데 굉장히 복잡하다.

0-1. 프레임은 총 10프레임이다.

0-2. 10프레임에 S나 P를 치면 추가기회가 있다.

1. 점수는 숫자, S, P, -로 들어온다.

2-1. S와 P를 치면 다음 기회에 얻은 점수만큼 추가점수가 있다.

2-2. 10프레임의 추가기회에는 추가점수가 주어지지 않는다.

대충 이정도만 알면 되는 것 같다.

일단 가장 처음 해야할 것은 문자를 숫자로 바꿔주기이다.

여기서 문제가 P처리인데 이전 인덱스의 점수 정보를 10에서 빼주면 쉽게 얻을 수 있

다.

def getscore(a):
    if s[i] == 'S':
        add = 10
        #if frame < 10:
            #plus.append(a+1)
            #plus.append(a+2) ----------------------
    elif s[a] == 'P': #                            ㅣ 추가점수처리
        add = 10 - ad #ad는 이전 인덱스의 점수      ㅣ
        #if frame < 10: ----------------------------
            #plus.append(a+1)
    elif s[a] == '-':
        add = 0
    else:
        add = int(s[a])
    return add

점수를 다 정수로 바꾸고 해야할 것은 스트라이크와 스페어의 추가점수 처리이다.

plus라는 리스트를 만들어 준 뒤 스트라이크나 스페어에 따라 다음 인덱스의 숫자들을 넣어준다.

그리고 현재 인덱스와 같은 숫자의 개수만큼 추가점수를 더해 준다.

def getscore(a):
    if s[i] == 'S':
        add = 10
        if frame < 10:
            plus.append(a+1) #스트라이크면
            plus.append(a+2) #다음 두 번 기회에 추가점수
    elif s[a] == 'P':
        add = 10 - ad
        if frame < 10:
            plus.append(a+1) #다음 한 번 기회에 추가점수
    elif s[a] == '-':
        add = 0
    else:
        add = int(s[a])
    return add

s = list(input())
#frame = 1
#stack = 0
answer = 0
plus = []

for i in range(len(s)):
    ad = getscore(i)
    answer += ad*(plus.count(i)+1) 

하지만 10프레임의 추가 기회에서는 추가점수를 얻지 못한다.

그러므로 프레임을 계산하는 부분도 만들어야한다.

프레임이 달라지는 경우는 두 개가 있다.

1. 한 프레임에 두 번의 투구를 했을 때

2. 스트라이크를 쳤을 때

매 투구마다 두번의 투구를 했는지 스트라이크를 쳤는지 검사를 하면 된다.

for i in range(len(s)):
    ad = getscore(i)
    answer += ad*(plus.count(i)+1)
    stack += 1 #매 투구마다 스택에 1을 더해주고
    if (s[i] == 'S') | (stack == 2): #스트라이크거나 스택이 꽉 차면
        stack = 0 #스택을 초기화해주고
        frame += 1 #프레임을 올려준다.

정답코드

def getscore(a):
    if s[i] == 'S':
        add = 10
        if frame < 10:
            plus.append(a+1)
            plus.append(a+2)
    elif s[a] == 'P':
        add = 10 - ad
        if frame < 10:
            plus.append(a+1)
    elif s[a] == '-':
        add = 0
    else:
        add = int(s[a])
    return add

s = list(input())
frame = 1
stack = 0
answer = 0
plus = []

for i in range(len(s)):
    ad = getscore(i)
    answer += ad*(plus.count(i)+1)
    stack += 1
    if (s[i] == 'S') | (stack == 2):
        stack = 0
        frame += 1

print(answer)

티어에 맞지않게 쉬운 난이도였다.

꿀문제 짱