본문 바로가기

프로그래머스(Java)/Level 1

[프로그래머스] [1차] 다트 게임

728x90

코드 힌트

  1. 문자열 파싱 및 점수 계산:
    • 주어진 dartResult 문자열을 순차적으로 탐색하며, 각 문자를 처리해 점수를 계산합니다.
    • 점수는 세 라운드로 이루어져 있으며, 각 라운드는 숫자(점수)와 보너스(S, D, T), 옵션(*, #)으로 구성됩니다.
  2. 점수 처리:
    • 각 라운드의 점수는 숫자 부분에서 추출합니다. 1 다음에 0이 나오는 경우는 10점으로 처리해야 하므로, 이를 특별히 체크합니다.
    • 라운드의 점수는 lastPoint와 currentPoint로 관리되며, 마지막에 최종적으로 합산됩니다.
  3. 보너스 처리:
    • 보너스 문자인 S, D, T는 각각 1제곱, 2제곱, 3제곱을 의미합니다.
    • 각 보너스 문자를 만나면, 현재 점수에 제곱 연산을 수행하여 보너스를 적용합니다.
  4. 옵션 처리:
    • *(스타상)은 현재 라운드와 이전 라운드의 점수를 각각 두 배로 만듭니다. 이를 위해 lastPoint와 currentPoint를 모두 곱합니다.
    • #(아차상)은 현재 라운드의 점수를 음수로 바꿉니다.
  5. 최종 결과 계산:
    • 마지막 라운드의 점수까지 모두 계산된 후, result에 더해 최종 점수를 반환합니다.

 


정답은 더보기 클릭

더보기
class Solution {
    public int solution(String dartResult) {
        int result = 0; // 최종 결과 점수
        int lastPoint = 0; // 이전 라운드 점수
        int currentPoint = 0; // 현재 라운드 점수
        
        // dartResult 문자열을 하나씩 확인
        for (int i = 0; i < dartResult.length(); i++) {
            char c = dartResult.charAt(i);
            
            // 현재 문자가 '1'이고, 다음 문자가 '0'이면 10점 처리
            if (c == '1' && dartResult.charAt(i+1) == '0') {
                result += lastPoint; // 이전 라운드 점수 누적
                lastPoint = currentPoint; // 현재 라운드 점수를 이전 라운드로 이동
                currentPoint = 10; // 현재 라운드는 10점
                i++; // '0'을 건너뛰기 위해 인덱스 증가
                continue;
            }
            // 한 자리 숫자일 때 처리
            if (c >= '0' && c <= '9') {
                result += lastPoint; // 이전 라운드 점수 누적
                lastPoint = currentPoint; // 현재 라운드 점수를 이전 라운드로 이동
                currentPoint = c - '0'; // 현재 라운드 점수 설정
                continue;
            }
            
            // 'S', 'D', 'T' 점수 계산
            if (c == 'S') {
                // S는 1제곱이므로 점수 변화 없음
                continue;
            } else if (c == 'D') {
                currentPoint *= currentPoint; // D는 2제곱
                continue;
            } else if (c == 'T') {
                currentPoint *= currentPoint * currentPoint; // T는 3제곱
                continue;
            }
            
            // '*', '#' 점수 보정
            if (c == '*') {
                lastPoint *= 2; // 이전 라운드 점수 2배
                currentPoint *= 2; // 현재 라운드 점수 2배
            } else if (c == '#') {
                currentPoint *= -1; // 현재 라운드 점수 마이너스
            }
        }
        
        // 마지막 라운드 점수를 결과에 더하기
        result += lastPoint + currentPoint;
        
        return result; // 최종 결과 반환
    }
}
728x90