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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


  • 풀이방법[알고리즘]

입력받은 String을 나눠서 점수를 계산하는 문제. 점수/보너스/옵션 순으로 값이 나오는데 2가지 부분을 주의해야 한다.

1. 점수는 1~10이기 때문에 2자리가 나올 수 도 있다는 점
2.옵션은 있을수도 없을 수도 있기 때문에 idx의 번호를 잘 체크해야한다는 점.

처음에 for문으로 돌리다가 idx 계산이 헷갈려서 while문에 넣고 idx를 처리해주었다. charAt으로 한글자씩 나눠서 값을 계산하는데, Character 클래스의 isDigit과 getNumericValue 메서드를 사용해서 숫자 값 호환을 쉽게할 수 있었다. 

옵션으로 나오는 값중 *는 앞의 값에도 영향을 미쳐서, 바로 값을 뽑을 수 있는 stack에 추가해주었다. 계산이 다 끝난후 stack에 들어있는 값을 다 더 하면 끝!

 

import java.util.*;

public class P17682다트게임_240329 {
    class Solution {
        public int solution(String dartResult) {
            int answer = 0;
            char ch = ' ';
            int score=0;
            int square=0;
            int size=0;
            int idx=0;
            int strLength = dartResult.length();
            Stack<Integer>stack = new Stack();
            while(idx<strLength-1){
                //점수
                ch = dartResult.charAt(idx);
                if(Character.isDigit(ch)){
                    score = Character.getNumericValue(ch);
                }//if
                //보너스
                ch = dartResult.charAt(++idx);
                if(ch=='0'){
                    score=10;
                    ch = dartResult.charAt(++idx);
                }
                switch(ch){
                    case 'S':
                        square = 1;
                        break;
                    case 'D':
                        square = 2;
                        break;
                    case 'T':
                        square = 3;
                        break;
                }
                score = (int)Math.pow(score,square);
                if(idx>strLength){
                    break;
                }

                //옵션
                if(idx+1>=strLength){
                    stack.add(score);
                    break;
                }
                ch = dartResult.charAt(++idx);
                if(Character.isDigit(ch)){
                    stack.add(score);
                }else{
                    size = stack.size();
                    switch(ch){
                        case '*':
                            if(size>0){
                                int tmp = stack.pop();
                                tmp*=(2);
                                stack.add(tmp);
                            }
                            stack.add(score*2);
                            break;
                        case '#':
                            stack.add(score*(-1));
                            break;
                    }//switch
                    idx++;
                }//if
            }//for

            for(int num:stack){
                answer+=num;
            }
            return answer;
        }
    }
}

+ Recent posts