볼링 점수 계산 (17215)
문제
소현이는 친구들과 함께 볼링을 치러 볼링장에 갔다. 그런데 볼링장의 시스템 오류로 인해 점수판에 점수가 집계 되지 않는 문제가 있었다. 밖이 너무 추운 나머지 소현이와 친구들은 그냥 치기로 하였고 1게임이 끝났지만 각자 점수가 얼마나 되는지를 계산하지 못하고 있다. 소현이와 친구들을 위해 볼링 점수를 계산해주는 프로그램을 작성해 보자.
볼링 규칙
1게임은 총 10프레임으로 구성되어 있다.
각 프레임마다 볼링핀 10개를 세워두고 공으로 쓰러뜨리는 것이며 기본적으로 볼링핀 1개당 1점이다.
각 프레임마다 2번의 기회가 주어지며 첫 번째 기회에 10개의 핀을 모두 쓰러뜨리는 것을 스트라이크(S)라고 한다.
두 번째 기회까지 사용하여 10개의 핀을 쓰러뜨리는 것을 스페어(P)라고 한다.
스트라이크를 치면 다음 두 번의 기회동안 쓰러뜨린 볼링핀의 개수만큼 추가점수를 얻게 된다.
10프레임을 제외한 프레임에서 스트라이크를 치면 해당 프레임의 두 번째 기회는 사라진다.
스페어를 치면 다음 한번의 기회동안 쓰러뜨린 볼링핀의 개수만큼 추가점수를 얻게 된다.
마지막 10번째 프레임에서 스트라이크를 칠 경우 두번의 보너스 기회가 제공된다. 이때 두번의 보너스 기회동안 추가점수는 존재하지 않는다.
마지막 10번째 프레임에서 스페어를 칠 경우 한번의 보너스 기회가 제공된다. 이때 한번의 보너스 기회동안 추가점수는 존재하지 않는다.
입력
첫째 줄에 각 기회마다 소현이가 쓰러뜨린 볼링핀의 개수가 공백없이 주어진다. 이때 스트라이크는 S
, 스페어는 P
, 핀을 하나도 못 쓰러뜨린 것은 -
으로 주어진다.
출력
첫째 줄에 소현이의 점수를 출력한다.
볼링을 좋아해서 자주 쳤었는데 점수 계산하는 방법을 몰라 볼링 점수 계산 방법을 따로 공부해서 푼 문제 ㅎㅎ.. 머쓱
열심히 디버깅한 결과 3트 성공
디버깅할때 열심히한 메모
풀이
기본 점수를 다 더한다.
10프레임이 (S, P)일 경우 보너스 프레임 추가
각 프레임이 더블인지, 터키인지 구분
1프레임 ~ 9프레임까지 보너스 점수 계산
터키일 경우 +20점
더블일 경우 +10 +(현재 프레임 인덱스 +2)
스트라이크일 경우 다음 2구에서 맞춘 핀의 개수를 더함
스페어일 경우 다음 1구에서 맞춘 핀의 개수를 더함
일단 볼링은 무조건 10 프레임으로 구성되어 있고 한 프레임 최대 2구를 던지므로 기본 점수, 보너스 점수 반복문을 따로 분리해서 구해줘도 될 것 같았다. (제한시간 1초)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
import java.io.*;
import java.util.*;
class FastScanner {
BufferedReader br;
StringTokenizer st;
public FastScanner() {
br = new BufferedReader(new InputStreamReader(System.in));
}
String next() {
while (st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
long nextLong() {
return Long.parseLong(next());
}
}
class Bowling{
boolean Db;
boolean tk;
public Bowling(){
this.Db = false;
this.tk = false;
}
}
public class Main {
static int frame = 10;
static StringBuilder in ;
static int i =0;
static int idx = 0;
static int frameUpCount=0;
static boolean bonusFrame = false;
static int score = 0;
static Bowling bwc[];
public static void main(String args[]) throws IOException{
FastScanner sc = new FastScanner();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
in = new StringBuilder(sc.next());
bwc = new Bowling[10];
for(int i=0; i<10; i++)
bwc[i] = new Bowling();
for(i=0; i<frame; idx++ ){
if(frameUpCount >= 2){
i++;
frameUpCount = 0;
}
if(i<=9) {
if(in.charAt(idx) == 'S') {
if (in.charAt(idx + 1) == 'S' && in.charAt(idx + 2) == 'S')
bwc[i].tk = true;
else if (in.charAt(idx + 1) == 'S')
bwc[i].Db = true;
}
if(in.charAt(idx) == 'P'){
bwc[i].tk = false;
bwc[i].Db = false;
}
}
if(i >= frame)
break;
/* 10 프레임에서 보너스 게임 추가 */
if(i== 9 && in.charAt(idx) == 'S') {
frame += 2;
bonusFrame = true;
}
else if (i == 9 && in.charAt(idx) == 'P') {
frame++;
bonusFrame = true;
}
score += changeScore(in.charAt(idx),idx);
}
bonusScore();
bw.write(Integer.toString(score));
bw.close();
}
public static int changeScore(char input,int idx){
switch (input){
case 'S':
frameUpCount=2;
return 10;
case 'P':
frameUpCount += (bonusFrame == false) ? 1 : 2;
return 10 - (in.charAt(idx-1) - '0');
case '-':
frameUpCount += (bonusFrame == false) ? 1 : 2;
in.replace(idx,idx+1, "0");
return 0;
default:
frameUpCount += (bonusFrame == false) ? 1 : 2;
return input - '0';
}
}
public static void bonusScore(){
frame = 9;
idx = 0;
frameUpCount = 0;
bonusFrame = false;
boolean cover = false; // 터키이상 일 경우
for(i=0; i<frame; idx++ ){
if(frameUpCount >= 2){
i++;
frameUpCount = 0;
}
if(bwc[i].tk == true){
score += 20;
i++;
frameUpCount =0;
}else if(bwc[i].Db == true){
score += (i != 9) ? 10 + changeScore(in.charAt(idx+2),idx) : 0;
i++;
frameUpCount =0 ;
}else if(in.charAt(idx) == 'S' && i<9){
for(int j=idx+1; j <= idx+2; j++){
score += changeScore(in.charAt(j),j);
}
}else if(in.charAt(idx) == 'P'){
score += changeScore(in.charAt(idx+1),idx);
}else{
frameUpCount++;
}
}
}
}