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

스브코·2021년 11월 9일

문제 출처: https://programmers.co.kr/learn/courses/30/lessons/17682

문제 설명

이런 형태로 String이 입력이 되는데,

1S2D*3T	

1D2S#10S	

1D2S0T		

1S*2T*3S	

1D#2S*3S	

1T2D3D#		

1D2S3T*

어떠한 특정 점수 계산 로직에 의해서 답을 Integer로 출력하면 되는 문제이다.

자세한 내용은 문제를 참조

문제풀이

import java.util.*;
class Solution {
    public int solution(String dartResult) {
        
        int [] num = new int [3];
        boolean [] numReceive = new boolean [3];
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < dartResult.length(); i++) {
            char cur = dartResult.charAt(i);
            String bonus = "SDT#*";
            if(!bonus.contains("" + cur)) {
                sb.append(cur);
            } else {
                if(sb.toString().length() > 0) {
                    for(int j = 0; j < numReceive.length; j++) {
                        if(!numReceive[j]) {
                            num[j] = optionCal(cur, Integer.parseInt(sb.toString()));
                            numReceive[j] = true;
                            sb.delete(0, sb.toString().length());
                            break;
                        }
                    }
                } else {
                    if(optionCal2(cur)) {
                       if(numReceive[2]){
                           num[1] = optionCal(cur, num[1]);
                           num[2] = optionCal(cur, num[2]);
                       } else if(numReceive[1]) {
                           num[0] = optionCal(cur, num[0]);
                           num[1] = optionCal(cur, num[1]);
                       } else {
                           num[0] = optionCal(cur, num[0]);
                       }
                    } else {
                        int k = 0;
                        for(k = 0; k < numReceive.length; k++) {
                           if(!numReceive[k]) {
                               num[k - 1] = optionCal(cur, num[k - 1]);
                               break;
                           }
                        }
                        if(k == 3)
                            num[2] = optionCal(cur, num[2]);
                    }
                }
            }
        }
        int answer = 0;
        for(int number : num) {
            answer += number;
            System.out.println(number);
        }
            
        return answer;
    }
    
    public static int optionCal (char cur, int num) {
        if (cur == '*')
            return num * 2;
        if (cur == '#')
            return num * -1;
        if (cur == 'D')
            return (int) Math.pow((double) num, 2);
        if (cur == 'T')
            return (int) Math.pow((double) num, 3);
        return num;
    }
    
    public static boolean optionCal2 (char cur) {
        return cur == '*';
    }
}

총 점수 계산을 하는 stage가 3번이고
"10"이라는 두자리 숫자가 포함되어 있으며,
' * '이나오면 바로 이전 스테이지까지의 점수까지 두배가 되어
처리해주어야 할 엣지 케이스가 좀 있었지만, 전반적으로 복잡한 문제는 아니었다.

다른 풀이

import java.util.*;
class Solution {
    public int solution(String dartResult) {
        Stack<Integer> stack = new Stack<>();
        int sum = 0;
        for (int i = 0; i < dartResult.length(); ++i) {
            char c = dartResult.charAt(i);
            if (Character.isDigit(c)) {
                sum = (c - '0');
                if (sum == 1 && i < dartResult.length() - 1 && dartResult.charAt(i + 1) == '0') {
                    sum = 10;
                    i++;
                }
                stack.push(sum);
            } else {
                int prev = stack.pop();
                if (c == 'D') {
                    prev *= prev;
                } else if (c == 'T') {
                    prev = prev * prev * prev;
                } else if (c == '*') {
                    if (!stack.isEmpty()) {
                        int val = stack.pop() * 2;
                        stack.push(val);
                    }
                    prev *= 2;
                } else if (c == '#') {
                    prev *= (-1);
                }
                // System.out.println(prev);
                stack.push(prev);
            }
        }
        int totalScore = 0;
        while (!stack.isEmpty()) {
            totalScore += stack.pop();
        }
        return totalScore;
    }
}

숫자인지 확인하는 함수 - Character.isDigit(c) 처음봄...

stack을 사용하여 효율이 좋다.. 이런 문제 유형에 스택을 사용하면 좋다는것을 배웠다..

profile
익히는 속도가 까먹는 속도를 추월하는 그날까지...

0개의 댓글