Welcome! Everything is fine.

[프로그래머스/Lv.1] 다트 게임(2018 KAKAO BLIND RECRUITMENT) - Java 본문

프로그래머스/Lv.1

[프로그래머스/Lv.1] 다트 게임(2018 KAKAO BLIND RECRUITMENT) - Java

개발곰발 2024. 4. 29.
728x90

📌 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

📌 풀이

이 문제는 문자열 처리를 묻는 문제였다. 어찌저찌 구현은 했지만 파고파고 들어가는 depth와 과한 if - else 문의 향연..이게 맞나 싶었지만 정답이긴 했다. 그냥 직관적으로 무식하게 짜서 그런지 속도도 꽤 빠르다..^^ 우선 내가 푼 순서의 흐름을 정리해보겠다.

  • 세 차례의 게임 후 얻는 점수를 저장할 배열을 만든다.
  • "점수|보너스|[옵션]" 으로 이루어진 문자열 dartResult를 순회한다.
    • dartResult.charAt(i)가 숫자일 경우
      • 그 다음 문자가 숫자일 경우(= 점수가 10점인 경우)
        • 보너스가 Single일 경우 : 점수 배열에 10 저장
        • 보너스가 Double일 경우 : 점수 배열에 100 저장
        • 보너스가 Triple일 경우 : 점수 배열에 1000 저장
      • 그 다음 문자가 숫자가 아닐 경우
        • 보너스가 Single일 경우 : 점수 배열에 i를 저장
        • 보너스가 Double일 경우 : 점수 배열에 i의 제곱 저장 → Math.pow(점수, 2)
        • 보너스가 Triple일 경우 : 점수 배열에 i의 세제곱 저장 → Math.pow(점수, 3)
    • 옵션이 스타상(*)이라면
      •  indexOf(찾을 문자, 시작 지점) 활용
      • 스타상(*)이 첫 번째 기회에서 나왔을 경우
        • 첫 번째 점수에 2를 곱하기
      • 스타상(*)이 두 번째 기회에서 나왔을 경우
        • 첫 번째 점수에 2를 곱하기
        • 두 번째 점수에 2를 곱하기
      • 스타상(*)이 세 번째 기회에서 나왔을 경우
        • 두 번째 점수에 2를 곱하기
        • 세 번째 점수에 2를 곱하기
    • 옵션이 아차상(#)이라면
      • indexOf(찾을 문자, 시작 지점) 활용  
      • 아차상(#)이 첫 번째 기회에서 나왔을 경우
        • 첫 번째 점수에 -1을 곱하기
      • 아차상(#)이 두 번째 기회에서 나왔을 경우
        • 두 번째 점수에 -1을 곱하기
      • 아차상(#)이  번째 기회에서 나왔을 경우
        • 세 번째 점수에 -1을 곱하기
  • 완성된 점수 배열의 요소를 모두 더해 합한다.

📌 전체 코드

class Solution {
    public int solution(String dartResult) {
        int answer = 0;
        int[] arr = new int[3];
        int idx = 0;
        for (int i = 0; i < dartResult.length(); i++) {
            if (Character.isDigit(dartResult.charAt(i))) { // 숫자일 경우
                if (Character.isDigit(dartResult.charAt(i + 1))) { // 그 다음 문자도 숫자일 경우(= 점수가 10일 경우) 
                     if (dartResult.charAt(i + 2) == 'S') {
                        arr[idx++] = 10;
                    } else if (dartResult.charAt(i + 2) == 'D') {
                        arr[idx++] = 100;
                    } else if (dartResult.charAt(i + 2) == 'T') {
                        arr[idx++] = 1000;
                    }
                    i++;
                } else { // 그 다음 문자는 숫자가 아닐 경우
                    if (dartResult.charAt(i + 1) == 'S') {
                        arr[idx++] = Character.getNumericValue(dartResult.charAt(i));
                    } else if (dartResult.charAt(i + 1) == 'D') {
                        arr[idx++] = (int) Math.pow(Character.getNumericValue(dartResult.charAt(i)), 2);
                    } else if (dartResult.charAt(i + 1) == 'T') {
                        arr[idx++] = (int) Math.pow(Character.getNumericValue(dartResult.charAt(i)), 3);
                    }
                }
            }
            
            if (dartResult.charAt(i) == '*') { // 옵션이 스타상일 경우
                if (dartResult.indexOf('*', i) == 2) {
                    arr[0] *= 2;
                } else if (dartResult.indexOf('*', i) < 6 && dartResult.indexOf('*', i) >= 4) {
                    arr[0] *= 2;
                    arr[1] *= 2;
                } else if (dartResult.indexOf('*', i) >= 6) {
                    arr[1] *= 2;
                    arr[2] *= 2;
                }
            } else if (dartResult.charAt(i) == '#') { // 옵션이 아차상일 경우
                if (dartResult.indexOf('#', i) == 2) {
                    arr[0] *= -1;
                } else if (dartResult.indexOf('#', i) < 6 && dartResult.indexOf('#', i) >= 4) {
                    arr[1] *= -1;
                } else if (dartResult.indexOf('#', i) >= 6) {
                    arr[2] *= -1;
                }
            }
        }
        
        for (int i = 0; i < arr.length; i++) {
            answer += arr[i];
        }
        
        return answer;
    }
}