담배팔이소년

[BOJ] 17215 볼링 점수 계산 본문

Algorithm

[BOJ] 17215 볼링 점수 계산

bkkmw 2023. 1. 2. 18:32

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

 

17215번: 볼링 점수 계산

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

www.acmicpc.net

 

문제 풀이

 

package boj;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class MainB_17215 {

	public static void main(String[] args) throws Exception{
		System.setIn(new FileInputStream("input/boj/input_17215.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int frames[] = new int[11];
		int pins[] = to_frame(br.readLine(), frames);
		
		int ans = calc_score(frames, pins);
		System.out.println(ans);
		br.close();
	}
	
	static int calc_score(int[] frames, int[] pins) {
		int ret = 0;
		
		for(int i=0; i<9; i++) {
			int frame_score = (frames[i] > 0)? 10 : (pins[2*i] + pins[2*i +1]);
			int bonus_score = 0;
			
			int next_idx = 2*(i+1);
			for(int j=0; j<frames[i]; j++) {
				if(pins[next_idx] == -1) next_idx++;
				bonus_score += pins[next_idx++];
			}
			
			ret += frame_score;
			ret += bonus_score;
		}
		
		for(int i=18; i<21; i++) ret += (pins[i] >= 0)? pins[i] : 0;
		return ret;
	}
	
	static int[] to_frame(String line, int[] frames) {
		int[] ret = new int[22];
		int ridx = 0;

		for(int i=0; i<line.length(); i++) {
			char temp = line.charAt(i);
			if(temp == 'S') {
				ret[ridx++] = 10;
				if(ridx/2 < 9)	ret[ridx++] = -1;
				frames[(ridx-1)/2] = 2;
			}
			else if(temp == 'P') {
				ret[ridx++] = (10 - ret[ridx-2]);
				frames[(ridx-1)/2] = 1;
			}
			else if(temp == '-') {
				ret[ridx++] = 0;
			}
			else {
				ret[ridx++] = temp - 48;
			}
		}
		
		for(int i=ridx; i<21; i++) {
			ret[i] = -1;
		}
		
		return ret;
	}
}

'Algorithm' 카테고리의 다른 글

[BOJ] 17143 낚시왕  (0) 2023.01.07
[BOJ] 22251 빌런 호석  (0) 2023.01.06
[BOJ] 17070 파이프 옮기기 1  (0) 2023.01.03
[BOJ] 07682 틱택토  (0) 2023.01.03
[Softeer] [인증평가(3차) 기출] 플레이페어 암호  (0) 2023.01.01
Comments