알고리즘 풀이/프로그래머스

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

데롱디롱 2021. 8. 30. 01:58
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;
    }
}