백준문제풀이

백준 문제 17215번 볼링 점수 계산 문제풀이 c++

노가다 김씨 2022. 3. 1. 20:35

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

 

17215번: 볼링 점수 계산

첫째 줄에 각 기회마다 소현이가 쓰러뜨린 볼링핀의 개수가 공백없이 주어진다. 이때 스트라이크는 S, 스페어는 P, 핀을 하나도 못 쓰러뜨린 것은 -으로 주어진다.

www.acmicpc.net

 

문제해석

 

볼링결과가 입력으로 주어지면 점수를 계산하는 코드를 구현하란것이 끝이다.

근데 볼링 점수계산은 잘 모르기도 하고 문제에서 설명해준게 약간 이해가 안가서 구글링으로 알아낸뒤 풀었다.

 

어떻게 짤지 윤곽을 안잡고 그냥 막 구현했더니 좀 더럽게 푼거같다...

 

스트라이크 또는 스페어일때 보너스 점수가 있고 10프레임에서 스트라이크 또는 스페어로 얻은 추가 기회는 보너스 점수로 들어가지 않는다 그리고 보너스점수는 9프레임까지는 존재하고 10 프레임은 보너스 점수가 존재하지 않는다를 인지한뒤 기본 점수 배열과 보너스 점수 배열을 따로 나눴다.

 

스트라이크를 쳤을때는 score[][0]에 -1 score[][1]에 10을 할당 시켜주었다 왜냐하면

스페어를 0 10 이렇게 쳤을때 score[][0] 0 score[][1]에 10이 할당이 되기 때문에 둘의 구분을 위해서였다.

어차피 -1은 나중에 합산할때 안 더해주면 그만이기 때문이다.

또한 10프레임에서 스트라이크를 쳤을때 추가 두번의 기회로 얻은 점수를 score[10][0]과 score[10][1]에 할당하고

스페어를 쳐서 추가 한번의 기회로 얻은 점수를 score[10][0]에 할당하였다.

10프레임에서 스트라이크,스페어를 못친 경우에는 score의 10행은 이용하지 않는다.(score[0][]~score[9][]까지만사용)

 

 

그 다음은 score[][]를 보면 스트라이크,스페어.그 외로 구분이 가능하고 스트라이크 또는 스페어였다면 문제에서 시키는대로 스트라이크일때는 다음 두번의 점수를 더해주고 스페어일때는 다음 한번의 점수를 더해주게 끔하였다.

 

보너스 점수도 할당이 끝나면 모든 0점이상의 점수를 다 더해주면 그것이 총점이 된다.

 

 

코드

#include <iostream>
#include <string>
using namespace std;
int score[11][2];
int bonus[9];
int frame=0;
int main(){
    cout.tie(NULL);
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);
    string s;
    cin>>s;
    int index=0;
    for(int i=0; i<10; i++)
    {
        frame++;
        for(int j=0; j<2; j++)
        {
            if(s[index]=='-')
            {
                score[i][j]=0;
                index++;
            }
            else if(s[index]=='P')
            {
                if(frame==10)
                {
                    if(s[s.size()-1]=='S')
                    {
                        score[10][0]=10;
                    }
                    else
                    {
                        score[10][0]=(int)s[s.size()-1]-(int)'0';
                    }
                }
                score[i][j]=10-score[i][j-1];
                index++;
            }
            else if(s[index]=='S')
            {
                if(frame==10)
                {
                    if(s[s.size()-2]=='S')
                    {
                        score[10][0]=10;
                    }
                    else
                    {
                        score[10][0]=(int)s[s.size()-2]-(int)'0';
                    }
                    if(s[s.size()-1]=='S')
                    {
                        score[10][1]=10;
                    }
                    else if(s[s.size()-1]=='P')
                    {
                        score[10][1]=10-score[10][0];
                    }
                    else
                    {
                        score[10][1]=(int)s[s.size()-1]-(int)'0';
                    }
                }
                score[i][0]=-1;
                score[i][1]=10;
                index++;
                break;
            }
            else
            {
                score[i][j]=(int)s[index]-(int)'0';
                index++;
            }
        }
    }
    for(int k=0; k<9; k++)
    {
        int cnt=0;
        if(score[k][0]==-1&&score[k][1]==10)
        {
            for(int i=k+1; i<11; i++)
            {
                for(int j=0; j<2; j++)
                {
                    if(score[i][j]>=0)
                    {
                        bonus[k]=bonus[k]+score[i][j];
                        cnt++;
                        if(cnt==2)
                        {
                            goto escape;
                        }
                    }
                }
            }
        }
        else if(score[k][0]+score[k][1]==10)
        {
            for(int i=k+1; i<11; i++)
            {
                for(int j=0; j<2; j++)
                {
                    if(score[i][j]>=0)
                    {
                        bonus[k]=bonus[k]+score[i][j];
                        cnt++;
                        if(cnt==1)
                        {
                            goto escape;
                        }
                    }
                }
            }
        }
        escape: continue;
    }
    int ans=0;
    for(int i=0; i<11; i++)
    {
        for(int j=0; j<2; j++)
        {
            if(score[i][j]>=0)
            {
                ans=ans+score[i][j];
            }
        }
    }
    for(int i=0; i<9; i++)
    {
        ans=ans+bonus[i];
    }
    cout<<ans;
}