알고리즘
[Programmers][1차] 다트게임(난이도:★★★★★★)
BaekGyuHyeon
2022. 5. 17. 09:26
https://programmers.co.kr/learn/courses/30/lessons/17682
코딩테스트 연습 - [1차] 다트 게임
programmers.co.kr
class Solution {
public int solution(String dartResult){
int[] arry = solutionA(dartResult,new int[]{});
int sum = 0 ;
for(int i : arry){
sum += i;
}
return sum;
}
public int[] solutionA(String t,int[] scores){
char[] arry = t.toCharArray();
int idx = 0;
// step1. 각 점수단위를 잘라낸다
// 3번째 글자부터 분석하여 숫자가 나올경우 해당 idx를 반환한다.
for(int i = 2; i < arry.length;i++){
if(isNumber(arry[i])){
idx = i;
break;
}
}
// step2. step1에서 찾은 index으로 자르면 1게임의 점수가 반환된다.
// 단 index값이 0이면 마지막 게임이므로 t 값 그대로 진행한다.
String tmp = t;
if(idx != 0)
tmp = t.substring(0,idx);
String num = "";
int number = 0;
for(char i : tmp.toCharArray()){
// 숫자면 num에 붙이고 그 값을 number에 저장한다.
// 기존 number에 10을 곱하는 이유는 두자리 수가 나오는 경우를 처리하기 위함
// 그리고 나머지 경우를 처리한다.
if(isNumber(i)){
int num = (i-48);
number = (number * 10) + num;
}else if(i == 35){
number *= -1;
}else if(i == 42){
number *= 2;
if(scores.length != 0){
scores[scores.length-1] = scores[scores.length-1] * 2;
}
}else{
number = findMulti(i).getMulti(number);
}
}
// 배열에 점수를 더하는 이유는 스타상(*)의 점수를 처리하려면
// 전 게임의 점수가 필요하기 때문
scores = add(scores,number);
// 마지막 게임이면 최종 점수 배열을 반환한다.
// 아니라면 idx기준으로 자르고 제귀함수 실행
if(idx == 0)
return scores;
else{
t = t.substring(idx);
return solutionA(t,scores);
}
}
// 숫자 판별
public boolean isNumber(char i){
return i > 47 && i < 58;
}
// 배열 append 하기
public int[] add(int[] s,int n) {
int[] res = new int[s.length+1];
int idx = 0;
for(int f: s) {
res[idx++] = f;
}
res[idx] = n;
return res;
}
// char 값으로 Multi값 찾기
public Multi findMulti(char i){
return Multi.valueOf(String.valueOf(i));
}
//Enum 사용
// S,D,T 값에 따라서 점수 반환
enum Multi{
S,D,T;
public int getMulti(int num) {
if(this.ordinal() == 0)
return num;
else if(this.ordinal() == 1)
return num * num;
else
return num*num*num;
}
}
}