• [level1] 프로그래머스 - 다트 게임(JAVA)

    2021. 8. 30.

    by. 데롱디롱

    728x90

     

    전체 코드는 맨 밑에 있어요 :)

     

     

    1. 처음은 무조건 숫자의 입력을 받는다.

    숫자가 한자리 수가 아닐 수 있기 때문에 while문isDigit를 이용해서 숫자를 담은 문자열을 만든다.
    StringBuilder sb = new StringBuilder();
    while(Character.isDigit(dartResult.charAt(i)))
    	sb.append(dartResult.charAt(i++));​

     

    문자열을 숫자로 바꾼다.
    int n = Integer.parseInt(sb.toString());​

     

     

    2. 다음 문자의 입력을 받고 'S', 'D', 'T'에 따라 각각 1제곱, 2제곱, 3제곱한 값을 구한다.

    Map에 각 점수마다 제곱할 값을 담아놓고
    HashMap<Character, Integer> score = new HashMap<Character, Integer>();
    score.put('S', 1);
    score.put('D', 2);
    score.put('T', 3);​

    Math.pow()함수를 이용하여 제곱한 값을 구한다.

     

     

    3. 옵션이 존재하지 않을 수 있으므로, 다음 문자가 숫자가 아니면 옵션인 것으로 간주한다.

    다음 문자를 확인하기 전에, 현재가 마지막 문자인 경우 stack에 값을 넣고 종료시켜주었다.
       ㄴ 현재 뒤 문자가 없는데 확인하려 하기때문에 nullPointException이 날 수 있기 때문
    if (i + 1 >= dartResult.length()) {	
    	num.add(n);
    	continue;
    }

     

     

    4. 옵션에 따라 처리를 해주고 stack에 계산한 값을 넣는다.

    뒤가 옵션인 경우 => isDigit(option)false인 경우
    - * 인 경우 : 자기 자신을 2배한 값을 넣는다.  => 비었든 안 비었든 공통!!
            ㄴ stack이 빈 것이 아닌 경우 : 맨 위의 값(이전의 값)을 꺼내 2배한 뒤 다시 넣는다.

    - #인 경우 : 자신의 값을 뺀다.
    char option = dartResult.charAt(i + 1);
    if (!Character.isDigit(option)) {
    	if (option == '*') {
    		if (!num.isEmpty())
    			num.add(num.pop() * 2);
    		num.add(n * 2);
    	} else
    		num.add(-n);
    	i++;	// 옵션문자로 위치를 옮겨주기 위해, 그래야 for문에 의해 ++되면 숫자를 가리킨다.
    } else
    	num.add(n);​

     

    옵션이 아니고 숫자인 경우 => 그냥 지금까지 계산한 값을 stack에 넣어둔다.

     

     

    5. stack에서 하나씩 꺼내면서 answer에 더한다.

     

     

    [ 전체 코드 ]

    import java.util.HashMap;
    import java.util.Stack;
    
    class Solution {
        public int solution(String dartResult) {
            int answer = 0;
            HashMap<Character, Integer> score = new HashMap<Character, Integer>();
            score.put('S', 1);
            score.put('D', 2);
            score.put('T', 3);
    
            Stack<Integer> num = new Stack<Integer>();
            for (int i = 0; i < dartResult.length(); i++) {
                StringBuilder sb = new StringBuilder();
                while(Character.isDigit(dartResult.charAt(i)))
                        sb.append(dartResult.charAt(i++));
                int n = Integer.parseInt(sb.toString());    // 숫자
    
                n = (int) Math.pow(n, score.get(dartResult.charAt(i))); // n제곱
    
                // 마지막에 옵션 없는 경우 =>  종료
                if (i + 1 >= dartResult.length()) { 
                    num.add(n);
                    continue;
                }
    
                // 옵션 처리
                char option = dartResult.charAt(i + 1);
                if (!Character.isDigit(option)) {
                    if (option == '*') {
                        if (!num.isEmpty())
                            num.add(num.pop() * 2);
                        num.add(n * 2);
                    } else
                        num.add(-n);
                    i++;
                } else
                    num.add(n);
            }
    
            while (!num.isEmpty())
                answer += num.pop();
    
            return answer;
        }
    }

    댓글