프로그래머스 [1차] 다트 게임 [Java]

문제 출처

https://programmers.co.kr/learn/courses/30/lessons/17682

 

코딩테스트 연습 - [1차] 다트 게임

 

programmers.co.kr

class Solution {
    public int solution(String dartResult) {
        int answer = 0;
        int i = 0;
        double fore = 0;
        while(i < dartResult.length()){
            double score = 0;
            String bonus = "";
            String option = "";
            
            while(Character.isDigit(dartResult.charAt(i))){
                score = score * 10 + Character.getNumericValue(dartResult.charAt(i++));
            }

            bonus += dartResult.charAt(i++);
    
            if(i < dartResult.length() && (dartResult.charAt(i) == '*' || dartResult.charAt(i) == '#')){
                option += dartResult.charAt(i++);
            }
            
            switch(bonus){
                case "D" :
                    score = Math.pow(score, 2);
                    break;
                case "T":
                    score = Math.pow(score, 3);
            }

            if(option != ""){
                switch(option){
                    case "*" :
                        fore *= 2;
                        score *= 2;
                        break;
                    case "#":
                        score = 0 - score;
                }
            }
            answer += fore;
            fore = score;
        }
        answer += fore;
        return answer;
    }
}

이것도 카카오 공채 코테 문제이기 때문에 카카오 기술블로그에 해설이 있다.

문자열 처리String Manipulation를 묻는 문제입니다. 앞에서부터 한 글자씩 잘라서 처리할 수 있고, 또는 간단한 컴파일러를 만들듯이 토큰화Tokenizing와 의미 분석Semantic Analysis을 통해 어렵지 않게 계산할 수 있습니다.

점수 중에는 한 자리뿐만 아니라 두 자리인 10점도 포함되어 있기 때문에 한 글자씩 잘라서 처리할때는 그 부분에 유의해야겠네요.

나는 한글자씩 잘라서 처리하는 방식을 선택했다. 

해설에 써 있듯 두 자리 수의 점수인 10도 있기 때문에 10을 위해서 if가 아닌 while문을 택했다.

 

옵션때문에 이전에 획득한 점수를 따로 처리하는 부분도 필요했는데 나는 fore라는 변수를 만들어 사용했다.

다른 사람 풀이를 보니 스택을 사용하는 분도 있고 나처럼 전체 점수, 이전 점수, 현재 점수 이렇게 세가지 변수를 사용하시는 분도 있었다.

 

myoskin