다트 게임_Java

컴투루·2022년 7월 6일
0

프로그래머스 Lv.1

목록 보기
34/38

2018 KAKAO BLIND RECRUITMENT

🔥 다트게임 🔥


👀 문제

다트게임의 점수로직을 이해한 후, 0 ~ 10의 정수와 문자 S,D,T,*,# 로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 완성하자

  1. 다트게임은 총 3번의 기회
  2. 각 기회마다 얻을 수 있는 점수는 0~10
  3. 점수와 함께 S,D,T영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱으로 계산됨
  4. 옵션으로 스타상(*), 아차상(#)이 존재하면 스타상 당첨 시 해당 점수와 바로 전에 얻은 점수를 각각 2배로 만듬, 아차상 당첨 시 해당 점수는 마이너스됨
  5. 스타상은 첫번째 기회에서도 나올 수 있고, 이 경우에는 첫번째 스타상의 점수만 2배가 됨
  6. 스타상의 효과는 다른 스타상과 중첩될 수 있음
  7. 스타상의 효과는 아차상과 중첩될 경우 중첩된 아차상의 점수는 -2배가 됨
  8. S,D,T는 점수마다 하나씩 존재함
  9. 스타상, 아차상은 점수마다 둘 중 하나만 존재할 수 있고, 존재하지 않을 수도 있음

👩‍💻 입력 형식

"점수|보너스|[옵션]"으로 이루어진 문자열 3세트
ex) 1S2D*3T
- 정수는 0에서 10사이의 정수
- 보너스는 S,D,T 중 하나
- 옵션은 *이나 # 중 하나이며, 없을 수도 있음

🧙 출력 형식

3번의 기회에서 얻은 점수 합계에 해당하는 점수값을 출력
ex) 37

👩‍💻 입력 & 🧙 출력


🙋‍♀️ 풀이

class Solution {
    public int solution(String dartResult) {
        int answer = 0;
        
        1️⃣
        char[] c = dartResult.toCharArray();
        2️⃣
        int[] score = new int[3]; 
        3️⃣
        int round = -1;
        
        4️⃣
        for(int i=0;i<c.length;i++){
            5️⃣
            if('0' <= c[i] && c[i] <= '9'){
                round++;
                score[round] += Integer.parseInt(String.valueOf(c[i]));
                
                6️⃣
                //점수가 10점일 때
                if(c[i] == '1' && c[i+1] == '0'){
                    score[round] -= Integer.parseInt(String.valueOf(c[i]));
                    score[round] = 10;
                    i++;
                }  
             7️⃣
            }else if(c[i] == 'D'){
                score[round] *= score[round];
            }else if(c[i] == 'T'){
                score[round] *= score[round]*score[round];
             8️⃣
            }else if(c[i] == '*'){
                if(round > 0) score[round-1] *=2;
                score[round] *=2;
            }else if(c[i] == '#'){
                score[round] *= -1;
            }
        }
        9️⃣
        answer = score[0]+score[1]+score[2];
        
        return answer;
    }
}

문제보고 감도 못 잡고 방황했다ㅎㅎ
씨름하다가 결국 다른분들의 풀이를 찾아본 후에야 문제를 해결할 수 있었다.

  1. toCharArray로 dartResult를 char형의 배열로 변환한다.
  2. 3번의 게임의 각각의 점수를 저장할 score변수 선언
  3. 몇번째 게임인지를 파악하는 round는 -1로 초기화해서 선언
  4. c의 길이만큼 반복문을 돌리면서 dartResult를 하나하나 살펴볼것이다.
  5. 만약 c의 i번째의 값이 '0'보다 같거나크거고 '9'와 같거나 작다면
    round를 +1하고 score의 round에 c의 i번째 값을 대입한다.
  6. c의 i번째가 '1'이고 i+1번째가 '0'이면 점수가 10점인 경우를 말한다. 따라서 score의 round번째에 있던 값을 제거해주고 10을 대입한다. 그리고 i++를 통해서 다음으로 넘어가도록 한다.
  7. c의 i번째가 D라면 2배 T라면 3배
  8. c의 i번째가 *이면 score의 round번째를 2배해주고 만약 round가 0보다 크다면 round-1의 점수도 2배해준다.
  9. answer의 값은 scroe의 0,1,2번째를 합한 값이다.

👏 마무리

profile
맘 먹으면 못할 게 없지

0개의 댓글