class Solution {
public int solution(String dartResult) {
int answer = 0;
int [] dart = new int[3]; //다트게임 문자열 3세트
int idx = 0; //dart 인덱스
String num = "";
int convert = 0;
int bonus = 0; // num에 보너스만큼 제곱 한 결과
for(int i=0; i<dartResult.length(); i++){
char div = dartResult.charAt(i); //문자열 나누기
// System.out.println((int)div);
//num += div - '0';
if(div >= '0' && div <='9'){ //점수(숫자)
num += String.valueOf(div);
}else if(div == 'S' || div=='D' || div=='T') { //보너스
convert = Integer.parseInt(num);
if(div == 'S') { //1제곱
bonus = (int) Math.pow(convert, 1);
}else if(div == 'D') { //2제곱
bonus = (int) Math.pow(convert, 2);
}else if(div == 'T') { //3제곱
bonus = (int) Math.pow(convert, 3);
}
dart[idx] = bonus; //첫번째 dart 점수 합산결과 저장
idx++;
num = ""; //다음 dart 점수 합산을 위해 빈 다트 초기화
} else { //옵션(필수 아님)
if(div == '*') {
dart[idx-1] *= 2; //해당 점수 2배
//첫번째 dart라면 해당 dart점수에만 2배를 해야함
//첫번째 dart가 아니면 직전 dart에 2배를 할 수 있음
if(idx-2>=0) {//0번째 인덱스까지 2배
dart[idx-2] *= 2;//이전 점수 2배
}
} else if(div == '#') {
dart[idx-1] *= (-1); //해당 점수 마이너스
}
}
}
answer = dart[0] + dart[1] + dart[2]; //각 연산결과 합
return answer;
}
}
3번의 다트게임을 통한 점수를 구하는 문제.
문자열 형식(3세트): "점수|보너스|옵션"
0~10
사이 정수S
(Single, 1제곱), D
(Double, 2제곱), T
(Triple, 3제곱)*
(해당점수와 직전 점수 2배), #
(해당점수만 *(-1))조건
*
는 첫번째 기회에서 나온다면 해당 점수만 2배, 중첩돼서 나온다면 4배*
과 #
가 중첩해서 나온다면 -2dartResult 가 1S2D*3T
라면,
1번째 dart: 1S
(점수,보너스)
2번째 dart: 2D*
(점수,보너스,옵션)
3번째 dart: 3T
(점수,보너스)
answer = 1^1*2+2^2*2+3^3
2번째 dart의 옵션 *
로 인해 직전 dart의 1S의 연산결과 *2
dartResult의 문자열을 하나씩 문자로 나누어 준 후에
해당 문자가 숫자면 String으로 형 변환 후 int로 다시 변환해주어
10이 1과 0으로 나누어져 계산되지 않도록 해주었습니다.
(이부분에서 num += div - '0';
코드로 작성했었다가 여러번 고뇌를 했습니다.)
제곱계산을 해주는 Math.pow()
를 사용하여 1제곱, 2제곱, 3제곱 연산을 해주었습니다.