- 메서드를 분리하면서 불필요한 메서드가 생긴 점이 아쉽다.
- 다른 사람의 풀이에는 스택을 이용해서 점수를 계산할 수 있게한 사람들이 많았다.
import java.util.*;
import java.util.stream.Collectors;
class Solution {
public int solution(String dartResult) {
Queue<String> input = Arrays.stream(dartResult.split("")).collect(Collectors.toCollection(LinkedList::new));
List<Integer> scores = new ArrayList<>();
while(scores.size() != 3) {
saveScore(scores,input);
}
int answer = scores.stream().reduce(0,(x,y) ->(x+y));
return answer;
}
private static void saveScore(List<Integer> scores, Queue<String> input) {
String strNumber = input.poll();
if(strNumber.equals("1")) {
if(input.peek().equals("0")) {
strNumber += input.poll();
}
}
int number = Integer.parseInt(strNumber);
int score = 0;
while (!input.isEmpty()) {
if(input.peek().matches("[0-9]")) {
break;
}
if(input.peek().matches("S|D|T")) {
int exponent = findExponent(input.poll());
score = (int) Math.pow(number,exponent);
continue;
}
if(input.peek().equals("*")) {
int option = findOption(input.poll());
score = plusStarOption(scores,score,option);
continue;
}
if(input.peek().equals("#")) {
int option = findOption(input.poll());
score = plusAchaOption(score,option);
continue;
}
}
scores.add(score);
}
private static int findExponent(String bonus) {
if(bonus.equals("S")) {
return 1;
}
if(bonus.equals("D")) {
return 2;
}
if(bonus.equals("T")) {
return 3;
}
throw new IllegalArgumentException();
}
private static int findOption(String option) {
if(option.equals("#")) {
return -1;
}
if(option.equals("*")) {
return 2;
}
throw new IllegalArgumentException();
}
private static int plusStarOption(List<Integer> scores, int score, int option) {
if(!scores.isEmpty()) {
scores.set(scores.size()-1,scores.get(scores.size()-1)*option);
}
return score*option;
}
private static int plusAchaOption(int score, int option) {
return score*option;
}
}