PS/Level1

[1차] 다트 게임

우봉수 2023. 2. 2. 13:44

<풀기 전 생각>

문자열의 조합이라 정규식을 활용하여 각 3번의 횟수의 대한 문자열을 나눌까도 생각하였지만 

처음에 0~10이 아닌 1~9 까지의 숫자가 들어온다고 착각하여 각 문자 하나당 처리하면 쉽게 풀 수 있을 것 같아

toCharArray()를 사용하여 문자열을 split()을 사용한 것 보다 빠르게 한 글자씩 채취해서

처리하고자 하였다.

 

<중간 문제점>

toCharArray()를 통해 char 타입으로 한 글자씩 추출 한 것은 좋았으나 Integer.parseInt()는 String 타입만을 지원하기 때문에 어떻게 해야 하나 고민 하였는데 간단히 +"" 공백을 추가하는 것으로 문자열로 바꾸어 해결 할 수 있었다.

10이 문자열에 포함되어 있어서 if문 하나를 추가해서 해결 하였지만

극단적으로 0~10 까지의 값 만을 가지고 답을 만들 수 있어 유연하지는 못 하게 된 것 같다.

 

 <전체 코드>

class Solution {
    // 시간 복잡도 O(n) 공간 복잡도 O(n)
    public int solution(String dartResult) {
        int answer = 0;
        char charArray[] = dartResult.toCharArray();
        // 얻을 수 있는 point는 3종류 이지만 * 아이템을 처리 하기위해 맨 앞에 공간을 하나 더 만들어줌 
        int points[] = new int[4];

        int turn = 1;
        int point = 0;
        for(int i=0;i<charArray.length;i++){
            // 점수 부분
            if(charArray[i]>='0'&&charArray[i]<='9') {
                if(charArray[i+1]>='0'&&charArray[i+1]<='9')
                    point += Integer.parseInt(charArray[i]+""+charArray[i+1]+"");
                else
                    point += Integer.parseInt(charArray[i] + "");
            }
            // 점수 보너스 부분
            else if(charArray[i]=='S'||charArray[i] == 'D'||charArray[i] == 'T'){
                if (charArray[i] == 'S')
                    point = (int)Math.pow(point, 1);
                else if (charArray[i] == 'D')
                    point = (int)Math.pow(point, 2);
                else
                    point = (int)Math.pow(point, 3);
                
                // 만약 다음 문자가 없거나 특수 문자가 아니라면 해당 점수를 저장하고 다음 점수로 파트로 넘아감
                if(i+1==charArray.length||(charArray[i+1]>='0'&&charArray[i+1]<='9')){
                    points[turn] = point;
                    turn++; point=0;
                }

            }
            // 특수 아이템 부분
            else{
                if(charArray[i]=='*') {
                    point *= 2;
                    points[turn-1]*=2;
                }
                else
                    point*=-1;

                points[turn] = point;
                point=0;
                turn++;

            }
        }

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

 

 

<메모>

Character.isDigit() 라는 함수를 통해 해당 문자가 숫자인지 아닌지 쉽게 판별이 가능해서 

앞으로는 (charArray[i]>='0'&&charArray[i]<='9') 대신 사용하면 좋을 것 같다.

 

해당 피턴의 정규식

String reg = "([0-9]{1,2}[S|T|D][*|#]{0,1})";

+ 해당 클래스를 사용한 아주 인상적인 풀이가 있어서 공부해두어야 할 것 같다.

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