코딩 테스트

(Java) 프로그래머스 다트 게임

로승리 2021. 11. 5. 02:03

문제를 보고 2가지 방식이 떠올랐다.

문자열을 하나씩 끊어서 검사해서 진행하는 방법

그리고 정규표현식으로 그룹을 나누고 계산하는 방법.

두가지 방법 모두 풀어보았다.

 


1. 문자열 끊어서 풀기

package progammers;

import java.util.Arrays;
import java.util.regex.Pattern;

public class DartGame {
    public static void main(String[] args) {
        String dartResult = "1D#2S*3S";
        int answer = 0;

        // 1. 문자열 마다 검사

        int[] score = new int[3];
        String tempString = "";
        int tempNum = 0;
        int idx = 0;

        for (int i = 0; i < dartResult.length(); i++) {
            // char를 이용해서 문자열 자르기
            char c = dartResult.charAt(i);
            
            // 숫자라면
            if (c >= '0' && c <= '9') {
                tempString += String.valueOf(c);
                // 점수 계산
            } else if (c == 'S' || c == 'D' || c == 'T') {
                tempNum = Integer.parseInt(tempString);
                if (c == 'S') {
                    tempNum = (int) Math.pow(tempNum, 1);
                } else if (c == 'D') {
                    tempNum = (int) Math.pow(tempNum, 2);
                } else {
                    tempNum = (int) Math.pow(tempNum, 3);
                }
                score[idx++] = tempNum;
                tempString = "";
            } else {
                // 스타상, 아차상 
              if(c == '#') {
                  score[idx-1] *= -1;
              } else {
                  score[idx-1] *= 2;
                  if(idx - 2 <= 0) {
                      score[idx - 2] *= 2;
                  }
              }
            }
        }

        for (int i = 0; i < score.length; i++) {
            answer += score[i];
        }

        return answer;
    }
}

 

2. 정규표현식을 이용해서 풀기

package progammers;

import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DartGame2 {
    public static void main(String[] args) {
        String dartResult = "1D#2S*3S";
        int answer = 0;

        // 2. 정규표현식으로 그룹별로 나누고 계산

        // 패턴 컴파일
        Pattern pattern = Pattern.compile("([0-9]+)([SDT])([*#]?)");

        // 컴파일된 패턴 검사
        Matcher matcher = pattern.matcher(dartResult);

        // 스텍을 이용해서 그룹별로 뽑기
        Stack<Integer> stk = new Stack<>();
        while(matcher.find()) {
            // 점수
            int num = Integer.parseInt(matcher.group(1));

            // 점수 곱하기
            if (matcher.group(2).equals("D")) {
                num *= num;
            }
            if (matcher.group(2).equals("T")) {
                num *= (num * num);
            }

            System.out.println(stk);
            // 스타상, 아차상
            if (matcher.group(3).equals("*")) {
                if(!stk.isEmpty()) {
                    int top = stk.pop();
                    stk.push(top * 2);
                }
                num *= 2;
            }
            if (matcher.group(3).equals("#")) {
                num *= -1;
            }
            stk.push(num);
        }
        while(!stk.isEmpty())
            answer += stk.pop();
        
        return answer;
    }
}