[프로그래머스/Java] 다트 게임

2025. 5. 30. 15:53·Problem Solving/프로그래머스

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

다트 게임은 3번의 기회로 구성된다.

각 기회마다 얻을 수 있는 점수는 0~10점이다.

점수와 보너스인 `S`, `D`, `T` 영역이 존재하고 각 영역 당첨 시 각각 1제곱, 2제곱, 3제곱으로 계산한다.

옵션으로 `*`, `#`이 존재하며 `*` 당첨 시 해당 점수와 바로 전의 점수를 각 2배로 만든다. `#` 당첨 시 해당 점수는 마이너스로 바뀐다.

`*`는 첫 번째 기회에도 등장하며 이 경우에는 해당 점수만 2배로 만든다. `*`는 다른 `*`와 중첩되어 적용된다. `*`는 `#`와도 중첩되어 이 경우 중첩된 `#`는 -2배가 된다. `*`나 `#`는 기회마다 하나만 존재하며, 존재하지 않을 수도 있다.

 

세 번의 기회가 `점수|보너스|옵션` 형태의 문자열로 주어지면, 문자열을 해석하여 총점수를 반환해야 한다.

 

풀이

주어진 문자열을 일단 문자 배열로 변환한다. (점수는 0~10 사이이므로 10은 예외 처리해준다.)

문자 배열을 돌면서, 현재 점수를 계산한다.

현재 문자가 숫자일 경우, 다음 문자는 보너스 문자이므로 `S`, `D`, `T` 문자에 맞는 처리를 해준다.

다음 문자가 옵션 문자일 경우, `*` 혹은 `#` 문자에 맞는 처리를 해준다.

현재 점수를 합계에 더하고, `*` 처리는 이전 점수가 필요하므로 이를 `previous`에 저장한다.

 

코드

class Solution {
    public int solution(String dartResult) {
        String preprocessed = dartResult.replace("10", "!");
        char[] chars = preprocessed.toCharArray();

        int sum = 0;
        int previous = 0;
        for (int i = 0; i < chars.length; i++) {
            char ch = chars[i];
            int current = 0;

            // 숫자 처리
            if (ch == '!' || Character.isDigit(ch)) {
                current = (ch == '!') ? 10 : ch - '0';

                // 보너스 문자 처리
                char bonus = chars[i + 1];
                switch (bonus) {
                    case 'S': current = (int) Math.pow(current, 1); break;
                    case 'D': current = (int) Math.pow(current, 2); break;
                    case 'T': current = (int) Math.pow(current, 3); break;
                }
                i++; // 보너스 처리했으므로 i 증가

                // 옵션 문자 처리
                if (i + 1 < chars.length) {
                    char option = chars[i + 1];
                    if (option == '*') {
                        current *= 2;
                        sum += previous; // 이전 점수를 한번 더 더함
                        i++;
                    } else if (option == '#') {
                        current *= -1;
                        i++;
                    }
                }

                sum += current;
                previous = current;
            }
        }

        return sum;
    }
}

 

저작자표시 비영리 동일조건 (새창열림)

'Problem Solving > 프로그래머스' 카테고리의 다른 글

[프로그래머스/JavaScript] 파일명 정렬  (0) 2025.07.01
[프로그래머스/JavaScript] 주차 요금 계산  (0) 2025.07.01
[프로그래머스/Java] 압축  (0) 2025.05.30
[프로그래머스/Java] k진수에서 소수 개수 구하기  (2) 2025.05.29
[프로그래머스/Java] 실패율  (2) 2025.05.28
'Problem Solving/프로그래머스' 카테고리의 다른 글
  • [프로그래머스/JavaScript] 파일명 정렬
  • [프로그래머스/JavaScript] 주차 요금 계산
  • [프로그래머스/Java] 압축
  • [프로그래머스/Java] k진수에서 소수 개수 구하기
friend5hip
friend5hip
개발 관련 지식이나 기록을 남기고 있습니다.
  • friend5hip
    friend5hip
    friend5hip
  • 전체
    오늘
    어제
    • 분류 전체보기 (60)
      • 컴퓨터공학 (2)
        • 자료구조 (0)
        • 알고리즘 (1)
        • 데이터베이스 (1)
      • Problem Solving (42)
        • BOJ (25)
        • 프로그래머스 (15)
      • 언어 (2)
        • JavaScript (2)
      • 라이브러리 (12)
        • React (12)
      • 개발 (2)
      • 기타 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    이분 탐색
    매개 변수 탐색
    시뮬레이션
    프로그래머스
    구간 합
    java
    JavaScript
    정렬
    N과 M
    집합
    react
    수학
    코드트리
    dfs
    구현
    소수 판별
    완전 탐색
    맵
    순열
    투 포인터
    삼성 sw 역량테스트
    누적 합
    백트래킹
    그리디
    intersection observer
    vite
    dp
    BFS
    백준
    문자열
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
friend5hip
[프로그래머스/Java] 다트 게임
상단으로

티스토리툴바