smooth waters run deep

1d-1c/Programmers

Level1_다트게임 (JAVA)

yeon_11 2020. 12. 11. 15:34
 

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

 

programmers.co.kr

import java.util.List;
import java.util.ArrayList;

class Solution {
    public int solution(String dartResult) {
        int[] cal = new int[3]; //3번의 기록 점수 저장 배열
        
        int idx = 0; //cal[] 인덱스
        
        for(int i=0; i<dartResult.length(); i++){
        	//숫자 판별
            if(dartResult.charAt(i)>='0' && dartResult.charAt(i)<='9'){
                if(i+1<dartResult.length() 
                && dartResult.charAt(i)=='1' && dartResult.charAt(i+1)=='0'){
                    cal[idx] = 10;
                    i++; //10인 경우: dartResult.charAt(i+1)까지 확인했으므로 i++ 해줌
                    continue; 
                }
                else {
                    cal[idx] = dartResult.charAt(i)-'0';
                    continue; //숫자 판별 -> 다른거 확인 안해도 됨 -> i++
                }
            }
            
            //S,D,T 판별
            if(dartResult.charAt(i)=='S'){
                cal[idx] = (int)Math.pow(cal[idx],1);
                idx++; //*#은 옵션이므로 일단 cal[] 인덱스++
                continue;
            }
            else if(dartResult.charAt(i)=='D'){
                cal[idx] = (int)Math.pow(cal[idx],2);
                idx++;
                continue;
            }
            else if(dartResult.charAt(i)=='T'){
                cal[idx] = (int)Math.pow(cal[idx],3);
                idx++;
                continue;
            }
            
            //*,# 판별 : cal[]의 인덱스는 현재 다음 칸을 가리키고 있음
            //그러므로 idx-1가 현위치를 의미
            if(dartResult.charAt(i)=='*'){
                if(idx-2>=0){
                    cal[idx-2] *= 2;
                    cal[idx-1] *= 2;
                }
                else
                    cal[idx-1] *= 2;
            }
        
            if(dartResult.charAt(i)=='#'){
                cal[idx-1] *= -1;
            }
        }
        
        int answer = 0;
        for(int i=0; i<3; i++){
            answer += cal[i];    
        }
        return answer;
    }
}

 

 

3개의 점수를 cal[] 배열에 저장하여 계산한 뒤, 3개의 점수를 합해 답을 리턴하도록 구현했다.

 

총 3번의 게임은 모두 [숫자+SDT] or [숫자+SDT+*#] 꼴로 나타내어진다.

그러므로 1.숫자를 확인하여 저장하고 -> 2.SDT를 확인해 1의 값을 수정하고 -> 3.*#에 따라 값을 수정한다.

 

세 번의 게임 점수는 각각 cal[0], cal[1], cal[2] 에 저장된다.

(cal[i]의 i를(cal[]배열의 인덱스를) 코드 내에서 idx로 표현했다.)

 

[숫자+SDT] or [숫자+SDT+*#] 에서, '숫자+SDT' 의 형태는 중복되므로,

1.숫자 -> 2.SDT 까지는 세 번의 게임에서 모두 계산하여 cal[idx]에 저장하고, idx++ 해준다.

 

만약 *#옵션이 주어지면,

숫자+SDT까지 행한 후 idx++해주었으므로 현재 위치를 idx-1로 보고 옵션 계산을 해주어야 한다.