[JAVA/프로그래머스] 2018 KAKAO BLIND RECRUITMENT: [1차] 다트게임

👀 문제

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

👊 도전

1. 설계

  1. dartResult를 charAt()으로 문자를 하나씩 확인한다.
  2. 숫자면 int형으로 바꿔서 저장한다.
  3. D, T가 나오면 제곱, 세제곱을 한다.
  4. *이면 현재 값과 이전 값에 두배를 곱한다.
  5. #이면 -1을 곱한다.

2. 구현 (성공 코드)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/**
 *
 * @author HEESOO
 *
 */
 class Solution {
  public int solution(String dartResult) {
      int answer = 0;
      int[] score=new int[3];
      int idx=-1;
      char ch;
      for(int i=0;i<dartResult.length();i++){
          ch=dartResult.charAt(i);
          if('0'<=ch&&ch<='9'){
              idx++;
              if(ch=='1'&&dartResult.charAt(i+1)=='0'){
                  score[idx]+=10;
                  i++;
              }
              else{
                 score[idx]+=ch-'0';
              }                  
          }
          else if(ch=='D'){
              score[idx]=(int)Math.pow(score[idx],2);
          }
          else if(ch=='T')
              score[idx]=(int)Math.pow(score[idx],3);
          else if(ch=='*'){
              if(idx==0){
                  score[0]*=2;
              }
              else{
                  score[idx]*=2;
                  score[idx-1]*=2;
              }
          }
          else if(ch=='#')
              score[idx]*=(-1);

      }
      for(int s:score)
          answer+=s;
      return answer;
  }
}
 

3. 결과

실행결과 🤟 성공 🤟

4. 설명

  1. dartResult를 charAt으로 문자를 추출한다.
    • charAt()으로 뽑은 값은 ch에 저장한다.
    • int[] 배열을 이용하여 3번의 게임 점수를 저장한다.
    • 숫자가 나오면 n번째 게임 점수를 나타내는 것이므로 배열 인덱스를 하나 증가시켜 새 인덱스에 값을 저장하도록 한다.
  2. ch가 숫자인지 체크한다.
    • ch==1이라면 뒤에 0이 오는지 따로 체크한다.
    • ch를 그대로 int배열에 저장하면 아스키코드 번호가 저장되므로 int형 숫자 값으로 바꿔서 저장한다.
  3. ch가 보너스인지 확인한다.
    • S는 1제곱이므로 값이 바뀌지 않는다. 그래서 따로 코드를 작성하지 않았다.
    • D는 현재 값에 제곱을 취한다.
    • T는 세제곱이다.
    • 제곱값은 Math.pow()로 제곱을 계산하였다.
  4. ch가 옵션인지 체크한다.
    • *이면 이전 값과 현재 값에 2배를 곱한다.
    • #은 현재 값에 -1을 곱한다.
  5. 계산이 끝나면 score배열을 순회하며 최종 합계를 저장한다.
    • for-each문을 이용하여 합계를 구했다.

👏 해결 완료!

어려운 문제는 아니었다. 어떻게 하면 효율적으로 작성할 수 있을까 고민해보았는데 그냥 if문으로 모든 경우를 구해서 푸는 게 정석인 것 같다. 처음에는 보너스나 옵션에 따라 split함수로 쪼개서 기회를 나눠볼까 생각했는데, 이러나 저러나 charAt으로 문자를 뽑아야하는 것은 똑같을 것 같아서 split은 사용하지 않았다.