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

 

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

 

programmers.co.kr

 

 

문제 분석

- 입력받은 문자열 3세트를 각각의 조건에 맞게 처리한다.

- 점수는 0~10사이의 숫자이고, 보너스는 S(1제곱), D(2제곱), T(3제곱)이다.

- 점수의 경우 10을 처리해야하기때문에 앞자리가 1인 경우 1인지 10인지 확인하여 처리한다.

- 추가 옵션이 있는데 *의 경우 해당 점수와, 직전의 점수를 2배로 만든다. #은 해당 점수를 마이너스 시킨다. 

- 추가 옵션 *는 서로 중첩될 수 있다. 

 

 

문제 풀이

1. while문을 통해 문자열을 탐색한다. 만약 탐색하는 인덱스(idx)가 탐색할 문자열의 길이(dartResult.length())만큼 탐색을 완료하면 종료한다.

2. 문자와 숫자를 처리해야하기 때문에 문자는 charAt함수를 활용하여 dartChar 변수를 통해 처리하고, 숫자는 dartChar변수를 int화 하여 dartInt 변수를 통해 처리한다.

3. if/else문을 통해 점수인지 문자인지 판단하고, 점수일 경우 앞자리가 1이면 1인지 10인지 판단한다. (10의 경우 두 자리숫자이기 때문에 탐색하는 인덱스(idx)를 증가시킨다)

4. 해당 점수를 점수판(score배열)에 넣어준다.

5. 만약 문자가 S, D, T중 하나라면 각각의 점수를 Math.pow함수를 통해 제곱처리해주고 정답 인덱스(point)를 증가시켜 다음 숫자를 처리한다.

6. 문자가 *, #인 경우 #은 해당 점수를 마이너스화 시켜주고, *인 경우 직전 숫자까지 처리할 수 있는지 if문으로 판단 후 해당 점수와 직전 점수를 두 배 처리해준다.

7. 점수판(score 배열)에 들어있는 점수들을 answer에 더하고 출력한다.

class Solution {
    
    public int solution(String dartResult) {
        int answer = 0;
		int idx = 0;
		int point = 0;
		int[] score = new int[3];

		while (true) {
			if (idx == dartResult.length()) {
				break;
			}
            
            char dartChar = dartResult.charAt(idx); // 글자 처리
            int dartInt = dartChar-'0'; // 숫자 처리
            
                
			if (0 <=  dartInt && dartInt <= 10) { // 점수일 경우
                if(dartInt == 1){ // 앞자리가 1인 경우 1인지 10인지 확인
                    if(dartResult.charAt(idx+1)-'0' == 0){ // 10인 경우
                        dartInt = 10;
                        idx++;
                    }
                }
				score[point] = dartInt;
				
			}else {
				if (dartChar == 'S') {
					score[point] = (int) Math.pow(score[point], 1);
					point++;
				} else if (dartChar == 'D') {
					score[point] = (int) Math.pow(score[point], 2);
					point++;
				} else if (dartChar == 'T') {
					score[point] = (int) Math.pow(score[point], 3);
					point++;
				} else if (dartChar == '*') {
					if(point-2>=0){
                        score[point-2] *=2;
                    }
                    score[point-1] *= 2;
				} else {
					score[point-1] *= -1;
				}
			}
            idx++;
		}

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

 

 

https://github.com/SOEUN2/Algorithm