본문 바로가기

PS

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

1) 문제 접근 방법

- 스택을 활용하는 것이 핵심인 문제이다.

- 1제곱, 2제곱, 3제곱 값은 Math.pow를 통해서 계산한 후에, int로 변환해서 스택에 저장합니다.

- *가 나왔을 때는, 스택에서 값을 꺼내서 2배를 해줍니다.

-> 이 때, 스택에 들어있는 값이 1개일 때와, 2개 이상일 때를 구분해서 계산해줍니다.

- #가 나왓을 때는, 스택에서 값을 꺼내서 -1배를 해줍니다. 

 

- 숫자들은 String에 추가해놓고, S, D 혹은 T가 나왔을 때, int로 변환해서 계산한 후, 스택에 저장합니다. 

- 최종적으로 저장된 값들을 모두 스택에서 꺼내서 더해줍니다. 

import java.util.*; 

class Solution {
    public int solution(String dartResult) {
        int answer = 0;
        
        // 숫자를 기록하기 위한 문자열 
        String numStr = "";
        
        // 스택을 선언한다. 
        Stack<Integer> stk = new Stack<>();
        
        // dartResult 문자열을 순회합니다. 
        for(int i=0; i<dartResult.length(); i++){
            
            // 문자 하나를 지정합니다. 
            char c = dartResult.charAt(i);
            
            // 문자가 숫자인 경우는, String으로 변환해서 
            // numStr에 더해줍니다. 
            if('0'<= c && c<= '9'){
                numStr += Character.toString(c);
            }
            // 문자열이 S, D 혹은 T인 경우 
            else if(c == 'S' || c == 'D' || c == 'T'){
                
                // numStr을 int형인 num으로 변환합니다. 
                int num = Integer.parseInt(numStr);
                int tmp = 0;
                
                // S, D, T 각각에 대해서, 값을 계산합니다. 
                // 그리고 tmp에 그 값을 저장합니다. 
                if(c == 'S'){
                    tmp = (int)Math.pow(num, 1);
                }else if(c == 'D'){
                    tmp = (int)Math.pow(num, 2);   
                }else if(c == 'T'){
                    tmp = (int)Math.pow(num, 3);
                }
                
                // tmp를 스택에 저장하고, numStr을 초기화합니다. 
                stk.push(tmp);
                numStr = "";
                
            }
            // 문자가 '*'인 경우는, 스택에서 가장 최근 값들을 빼서(최대 2개까지)
            // 2배를 해준 후에 다시 스택에 넣어줍니다. 
            else if(c == '*'){
                
                if(stk.size() == 1){
                    int num = stk.pop();
                    stk.push(num*2);
                }else if(stk.size() >= 2){
                    int num1 = stk.pop();
                    int num2 = stk.pop();
                    stk.push(num2*2);
                    stk.push(num1*2);
                }
                
            // 문자가 '#'인 경우는, 스택에서 가장 최근 값 한 개를 빼서,
            // -1을 곱해준 후에 다시 스택에 넣어줍니다. 
            }else if(c == '#'){
                int num = stk.pop();
                stk.push(num*-1);
            }    
        }
        
        // 스택에 있는 모든 값들을 합해줍니다. 
        while(!stk.isEmpty()){
            answer += stk.pop();
        }
        
        return answer;
    }
}

'PS' 카테고리의 다른 글

캐시 [프로그래머스]  (0) 2023.06.03
뉴스 클러스터링 [프로그래머스]  (0) 2023.06.03
실패율 [프로그래머스]  (0) 2023.06.03
오픈채팅방 [프로그래머스]  (0) 2023.06.03
알파벳 [BOJ 1987]  (0) 2022.10.10