문제

https://www.welcomekakao.com/learn/courses/30/lessons/17682

풀이

class Solution {
  public int solution(String dartResult) {
      int answer = 0;
      int[] tempArray = new int[3];
      int temp = 0;
      int cnt = 0;
      char[] charArray = dartResult.toCharArray();
      
      for(char ch : charArray){
          if(Character.isDigit(ch)){ //숫자                   
              if(temp == 1 && ch == '0'){                  
                  temp = 10;
                  tempArray[cnt-1] = temp; 
                  continue;
              }
              
              temp = Character.getNumericValue(ch);
              tempArray[cnt++] = temp;           
          }else{ //문자
              if(ch == 'D'){                
                  temp = (int)Math.pow(temp, 2);
              }else if(ch == 'T'){
                  temp = (int)Math.pow(temp, 3);
              }else if(ch == '*'){
                  if(cnt == 0){
                      temp = temp*2;
                  }else{
                      if(cnt == 1) tempArray[cnt-1] = tempArray[cnt-1]*2;
                      else tempArray[cnt-2] = tempArray[cnt-2]*2;
                      temp = temp*2;
                  }
              } else if(ch == '#'){
                  temp = temp*-1;
              }
              
              tempArray[cnt-1] = temp;
          }          
      }
      
      for (int n : tempArray) answer += n;
      
      return answer;
  }
}

다른 사람들의 풀이를 안 보고 풀어보겠다고 나름 풀어봤는데… 풀고 나서 다른 사람들의 풀이를 보니 너무 바보같이 푼 것 같다. 왜 풀 때는 정규식으로 split할 생각을 못 했는지… 아무튼 내가 푼 방식은 먼저 String 변수를 char로 한 글자씩 쪼개어 Array에 담아서 각 글자를 체크하는 방식이다.

일단 처음 생각했을 때 String 문자는 결국 숫자 아니면 문자(*,#,S,D,T)이기 때문에 먼저 꺼낸 문자가 숫자인지 체크해준다.(isDigit)

그런 다음 숫자라면 또 케이스가 나뉘는데 0~9인지, 10인지 체크해준다. 10인지 체크할 땐 이전 루프에서 temp 변수에 담아두었던 문자가 숫자일 때, 그 문자가 1이고 지금 꺼낸 문자가 0이면 10으로 인식하고 현재의 temp 변수에 10을 담아준다.

만약 문자라면 S는 사실상 *1이기 때문에 if 케이스에서 빼버렸고 D, T일 땐 각각 Math.pow를 이용하여 제곱을 계산해주었다. 그리고 *일 경우는 두가지 케이스로 나누어 생각했는데 1) 첫번째 숫자에 나왔을 때, 2) 2, 3번째 숫자에 나왔을 때 이다. 첫번째 숫자라면 첫 숫자만 2배로 해주면 되지만 2, 3번째 숫자라면 현재 숫자(temp)와 각각 1, 2번재 숫자도 같이 2배로 해줘야한다.

마지막으로 #이 나오면 temp에 -1을 곱하여 빼주도록 해준다. 이렇게 각 케이스에 대하여 다 계산을 마친 후 최종적으로 for문을 통해 tempArray 안의 3개 값을 더해준다.

일단 보이는 테스트 케이스는 다 합격 하였고 보통 시간도 0.몇 초에서 1초 대 정도 걸린 것 같다. 하지만 내가 봐도 뭔가 숨은 테스트 케이스에서 걸릴 거 같은 엉성한 부분이 있어서 완전히 잘 풀었다곤 자신 못 하겠다.