[JAVA] [LEVEL1] 프로그래머스 - 다트 게임

반응형

프로그래머스 programmers Level1 다트 게임 - java

[문제]

2018 KAKAO BLIND RECRUITMENT

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

 

프로그래머스

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

programmers.co.kr

 

[풀이]

문제에 입력형식이  점수|보너스|[옵션]  으로 주어져 있어 입력받는 문자를 한글자씩 잘라서 확인하는 방법을 생각했다.

  1. 다트는 세번 던지며 "점수|보너스|[옵션]" 이므로, 각 다트의 점수를 산출할 길이 3의 배열을 생성한다.
  2. 입력받는 문자를 한글자씩 잘라 배열에 담는다.
  3. 배열 splitDartResult 를 for 문으로 한글자씩 확인한다.
    3.1. 숫자인 경우, 점수이므로 다트 던진 순서에 맞게 dartScore 배열에 넣어준다.
    3.2. Single (S), Double (D), Triple (T) 의 경우, 보너스를 다트 던진 순서에 맞게 보너스계산 수행한다.
    3.3. 옵션이 있는 경우, 스타상(*) 또는 아차상(#)에 맞는 계산을 해준다.
  4. 세번의 다트 점수를 합해서 답을 반환한다.

 

[java 코드]

public int solution(String dartResult) {
    int answer = 0;
    // 세 번의 다트 각 점수 담는 배열
    int[] dartScore = new int[3];
    int idx = -1; // dartScore 배열 인덱스

    String[] splitDartResult = dartResult.split("");
    for (int i = 0; i < splitDartResult.length; i++) {
        if (splitDartResult[i].matches("[0-9]")) {
            if (i == 0) {
                idx++;
                dartScore[idx] = Integer.valueOf(splitDartResult[i]);
            } else {
                // 10인 경우
                if ("0".equals(splitDartResult[i]) && "1".equals(splitDartResult[i - 1])) {
                    dartScore[idx] = 10;
                } else {
                    idx++;
                    dartScore[idx] = Integer.valueOf(splitDartResult[i]);
                }
            }
        } else if (splitDartResult[i].matches("[S|D|T]")) {
            // S|D|T 체크
            int powNum = getPowNum(splitDartResult[i]);
            dartScore[idx] = (int) Math.pow(dartScore[idx], powNum);
        } else if (splitDartResult[i].matches("[*|#]")) {
            // 옵션 체크
            if ("*".equals(splitDartResult[i])) {
                // *, 스타상이면 *2 (현재 점수 , 바로 직전 점수)
                dartScore[idx] *= 2;
                if (idx > 0) {
                    dartScore[idx - 1] *= 2;
                }
            } else {
                // #, 아차상이면 * -1 (마이너스 부호 붙여주기)
                dartScore[idx] *= -1;
            }
        }
    }
    answer = dartScore[0] + dartScore[1] + dartScore[2];
    return answer;
}

private int getPowNum(String powStr) {
    int result = "S".equals(powStr) ? 1 : "D".equals(powStr) ? 2 : 3;
    return result;
}

[채점 결과]

 

문제를 풀며 아쉬운 점은 한 글자씩 잘라서 생각한 포인트에서 발생했다.  점수|보너스|[옵션]  에서 점수가 두자리인 경우가 존재하기 때문이다. 즉, 문제에서 0~10점이 조건으로 주어졌으므로 10점이 들어가는 경우를 고려해야 한다.

따라서 한 글자씩 확인하는 방법으로 「점수 : [0-9] → 보너스 : [S|D|T] → 옵션 : [*|#]」 으로 될 것을 생각했는데 10점인 경우는 「숫자 → 숫자 → 보너스 → 옵션」의 순서가 되어버린다.

그래서 숫자를 판별하는 if (splitDartResult[i].matches("[0-9]")) { ... } 부분의 코드가 깔끔하지 못하게 되어버렸다. 

반응형