본문 바로가기

알고리즘/Programmers

[Programmers / Java] 다트 게임

문제링크

코드

import java.util.*;

class Solution {
    public int solution(String dartResult) {
        String[] split = dartResult.split("");

        Stack<Integer> stack = new Stack<>();
        int result = 0;

        for(int i = 0; i < split.length; i++){
            String s = split[i];
            
            if(s.equals("0")){
                stack.add(0);
                continue;
            }

            if(s.equals("1") && split[i+1].equals("0")){
                s = "10";
                i++;
            }

            int qqwe = 0;

            if(s.chars().allMatch(Character::isDigit)){//숫자이면
                if(split[i+1].equals("S")){
                    qqwe += Math.pow(Integer.parseInt(s),1);
                    stack.add(qqwe);
                }
                if(split[i+1].equals("D")){
                    qqwe += Math.pow(Integer.parseInt(s),2);
                    stack.add(qqwe);
                }
                if(split[i+1].equals("T")){
                    qqwe += Math.pow(Integer.parseInt(s),3);
                    stack.add(qqwe);
                }
            }
            if(split[i].equals("#")){
                int i1 = stack.pop() ;
                stack.add(i1 * -1 );
            }
            if(split[i].equals("*")){
                if(stack.size() == 1) {
                    int i1 = stack.pop() ;
                    stack.add(i1 * 2);
                    continue;
                }
                int i1 = stack.pop() ;
                int i2 = stack.pop() ;
                stack.add(i2 * 2);
                stack.add(i1 * 2);
            }
        }
        for (Integer integer : stack) {
            result += integer;
        }
        return result;
    }
}

 

어떤점이 어려웠나?

문제를 푸는 과정에서 문자열을 나눠서 시작했습니다.

 

3번의 기회에서 얻은 점수를 stack에다 넣어서 관리합니다.

*를 만나면 2번 pop해서 2를 곱한다음에 넣어줍니다. 만약 첫번째 기회때 *가 올 수도 있으니 stack의 size가 1일때 처리를 해줍니다.

#를 만나면 1번 pop해서 -1을 곱한 다음 다시 stack에 넣어줍니다.

 

 

문자열을 하나씩 쪼개서 for문을 돌 때 숫자이면 그 다음 문자를 판별하게 되어있습니다. 이때 0, 10의 처리를 따로해주어야 합니다.

 

0일 때는 그냥 stack에 0을 넣습니다.

 

10일때는 stack에 10을 넣고 다음 문자를 판별하기 위해 i++합니다. 그러면 글자가 있을것입니다.

 

728x90