끄적끄적 코딩일지

[Programmers][1차] 다트게임(난이도:★★★★★★) 본문

알고리즘

[Programmers][1차] 다트게임(난이도:★★★★★★)

BaekGyuHyeon 2022. 5. 17. 09:26

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

 

코딩테스트 연습 - [1차] 다트 게임

 

programmers.co.kr

class Solution {
    public int solution(String dartResult){
        int[] arry = solutionA(dartResult,new int[]{});
        int sum = 0 ;
        for(int i : arry){
            sum += i;
        }
        return sum;
    }
    public int[] solutionA(String t,int[] scores){
        char[] arry = t.toCharArray();
        int idx = 0;
        // step1. 각 점수단위를 잘라낸다
        // 3번째 글자부터 분석하여 숫자가 나올경우 해당 idx를 반환한다.
        for(int i = 2; i < arry.length;i++){
            if(isNumber(arry[i])){
                idx = i;
                break;
            }
        }
        // step2. step1에서 찾은 index으로 자르면 1게임의 점수가 반환된다.
        // 단 index값이 0이면 마지막 게임이므로 t 값 그대로 진행한다.
        String tmp = t;
        if(idx != 0)
            tmp = t.substring(0,idx);
        String num = "";
        int number = 0;
        for(char i : tmp.toCharArray()){
        // 숫자면 num에 붙이고 그 값을 number에 저장한다.
        // 기존 number에 10을 곱하는 이유는 두자리 수가 나오는 경우를 처리하기 위함
        // 그리고 나머지 경우를 처리한다.
            if(isNumber(i)){
                int num = (i-48);
                number = (number * 10) + num;
            }else if(i == 35){
                number *= -1;
            }else if(i == 42){
                number *= 2;
                if(scores.length != 0){
                    scores[scores.length-1] = scores[scores.length-1] * 2;
                }
            }else{
                number = findMulti(i).getMulti(number);
            }
        }
        // 배열에 점수를 더하는 이유는 스타상(*)의 점수를 처리하려면
        // 전 게임의 점수가 필요하기 때문
        scores = add(scores,number);
        // 마지막 게임이면 최종 점수 배열을 반환한다.
        // 아니라면 idx기준으로 자르고 제귀함수 실행
        if(idx == 0)
            return scores;
        else{
            t = t.substring(idx);
            return solutionA(t,scores);
        }
    }
    // 숫자 판별
    public boolean isNumber(char i){
        return i > 47 && i < 58;
    }
    // 배열 append 하기
	public int[] add(int[] s,int n) {
		int[] res = new int[s.length+1];
		int idx = 0;
		for(int f: s) {
			res[idx++] = f;
		}
		res[idx] = n;
		return res;
	}
    // char 값으로 Multi값 찾기
	public Multi findMulti(char i){
		return Multi.valueOf(String.valueOf(i));
	}
    //Enum 사용
    // S,D,T 값에 따라서 점수 반환
	enum Multi{
        S,D,T;
		public int getMulti(int num) {
			if(this.ordinal() == 0)
				return num;
			else if(this.ordinal() == 1)
				return num * num;
			else
				return num*num*num;
		}
    }
}