[코딩테스트] 다트 게임 | 프로그래머스

Bluewave·2024년 5월 17일

코테공부_java

목록 보기
30/99
post-thumbnail

문제

✍🏻 문제 바로가기

문제레벨정답률
다트 게임Lv.159%

문제를 풀다가 형변환, 문자열 파싱 방법 등이 꼬여서 문법적 오류가 발생하였고, 이를 해결하지 못해 풀이에 실패하였다.

최적의 코드

class Solution {
    public int solution(String dartResult) {
        int[] scores = new int[3];
        int index = -1;
        
        for (int i = 0; i < dartResult.length(); i++) {
            char dart = dartResult.charAt(i);
            
            if (Character.isDigit(dart)) {
                index++;
                if (dart == '1' && dartResult.charAt(i+1) == '0') {
                    scores[index] = 10;
                    i++; // Skip one more character as '10' is considered as one dart
                } else {
                    scores[index] = Character.getNumericValue(dart);
                }
            } else if (dart == 'S') {
                scores[index] = (int) Math.pow(scores[index], 1);
            } else if (dart == 'D') {
                scores[index] = (int) Math.pow(scores[index], 2);
            } else if (dart == 'T') {
                scores[index] = (int) Math.pow(scores[index], 3);
            } else if (dart == '*') {
                scores[index] *= 2;
                if (index > 0) {
                    scores[index-1] *= 2;
                }
            } else if (dart == '#') {
                scores[index] *= -1;
            }
        }
        
        return scores[0] + scores[1] + scores[2];
    }
}

우선 현재 문자가 숫자일 경우엔 다음과 같이 처리한다.

  1. 현재 문자가 1이고, 다음 문자가 0인 경우 :
    두 자리 숫자이기에 함께 처리하기 위해서 i++을 해준다.
  2. 아닌 경우 :
    scores 배열에 점수를 추가한다.

현재 문자가 숫자가 아니라면 다음과 같이 처리한다.

  1. S일 경우 scores 배열의 숫자를 1제곰
  2. D일 경우 scores 배열의 숫자를 2제곱
  3. T일 경우 scores 배열의 숫자를 3제곱
  4. '*' 일 경우 scores 배열의 숫자에 2를 곱하고, 첫 번째 다트가 아니라면 앞scores 숫자에도 2를 곱한다.
  5. #일 경우 scores 배열의 숫자에 -1을 곱한다.

마지막으로 3가지 scores 값을 다 더해서 return 한다.

문법 정리

문자가 숫자인지 판별

Character.isDigit(num))

문자의 숫자를 숫자 형식으로 가져오기

Character.getNumericValue(num)


레벨 1의 문제인데, 체감상 레벨 2에 가까웠던 것 같다.
단순하게는 char 변수의 문자를 숫자인지 판별하는 방법도 모르고 있어서 이런 단순한 문법을 모른 상태로 풀자니 어려웠다.
그리고 전체적인 로직을 위의 코드처럼 간단하게 구현하는 것도 생각보다는 어려웠던 문제같다.
그렇지만 문제를 봤을때 전혀 풀지 못할 문제는 아니어서, 다음부터는 이런 문자열 문제들도 처리할 수 있도록 더 열심히 해야겠다.

profile
Developer's Logbook

0개의 댓글