프로그래머스 다트 게임 JAVA 풀이

2026. 7. 4. 23:42·코테(Solved.ac + Programmers)
728x90

🔗 문제 링크

 

프로그래머스

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

programmers.co.kr


📌 문제 개요

다트 게임 결과 문자열이 주어졌을 때, 총 3번의 기회에서 얻은 점수의 합을 구하는 문제이다.

각 점수는 0부터 10까지이며, 점수 뒤에는 보너스 영역인 S, D, T가 붙는다.

보너스에 따라 점수는 각각 1제곱, 2제곱, 3제곱으로 계산된다.

 

또한 옵션으로 * 또는 #이 붙을 수 있다.

*은 현재 점수와 이전 점수를 2배로 만들고, #은 현재 점수를 음수로 만든다.


📌 접근 방법

문자열을 왼쪽부터 순회하면서 점수, 보너스, 옵션을 차례대로 처리한다.

각 회차별 점수를 저장하기 위해 크기가 3인 배열을 사용한다.

 

숫자를 만나면 점수를 구하고, 바로 뒤에 오는 보너스를 확인하여 제곱 계산을 한다.

이후 옵션 문자가 존재하면 *, #에 따라 점수를 추가로 변경한다.

마지막에는 배열에 저장된 세 점수를 모두 더해 반환한다.


📌 핵심 아이디어점수 저장 배열 사용

1. 점수 저장 배열 사용

각 기회별 점수를 따로 저장하면 * 옵션처럼 이전 점수에 영향을 주는 경우도 쉽게 처리할 수 있다.

int[] scores = new int[3];

 

 

2. 10점 처리

점수는 0부터 10까지 가능하다.

대부분은 한 자리 숫자지만, 10은 두 자리이므로 별도로 처리해야 한다.

if (dartResult.charAt(i) == '1' && i + 1 < dartResult.length() && dartResult.charAt(i + 1) == '0') {
    score = 10;
    i++;
} else {
    score = dartResult.charAt(i) - '0';
}

 

3. 보너스 처리

S, D, T에 따라 각각 1제곱, 2제곱, 3제곱으로 점수를 계산한다.

if (bonus == 'S') {
    score = (int) Math.pow(score, 1);
} else if (bonus == 'D') {
    score = (int) Math.pow(score, 2);
} else if (bonus == 'T') {
    score = (int) Math.pow(score, 3);
}

 

4. 옵션 처리

*은 현재 점수와 이전 점수를 2배로 만든다.

첫 번째 점수에는 이전 점수가 없으므로 인덱스 범위를 확인해야 한다.

#은 현재 점수만 음수로 변경한다.

if (option == '*') {
    scores[idx - 1] *= 2;

    if (idx - 2 >= 0) {
        scores[idx - 2] *= 2;
    }
} else if (option == '#') {
    scores[idx - 1] *= -1;
}

📌 전체 코드

class Solution {
    public int solution(String dartResult) {
        int[] scores = new int[3];
        int idx = 0;

        for (int i = 0; i < dartResult.length(); i++) {
            char ch = dartResult.charAt(i);

            if (Character.isDigit(ch)) {
                int score;

                if (ch == '1' && i + 1 < dartResult.length() && dartResult.charAt(i + 1) == '0') {
                    score = 10;
                    i++;
                } else {
                    score = ch - '0';
                }

                char bonus = dartResult.charAt(++i);

                if (bonus == 'S') {
                    score = (int) Math.pow(score, 1);
                } else if (bonus == 'D') {
                    score = (int) Math.pow(score, 2);
                } else if (bonus == 'T') {
                    score = (int) Math.pow(score, 3);
                }

                scores[idx++] = score;

                if (i + 1 < dartResult.length()) {
                    char option = dartResult.charAt(i + 1);

                    if (option == '*') {
                        scores[idx - 1] *= 2;

                        if (idx - 2 >= 0) {
                            scores[idx - 2] *= 2;
                        }

                        i++;
                    } else if (option == '#') {
                        scores[idx - 1] *= -1;
                        i++;
                    }
                }
            }
        }

        return scores[0] + scores[1] + scores[2];
    }
}
 

📄 정리

  • 문자열을 순회하면서 점수, 보너스, 옵션을 순서대로 처리하는 문제이다.
  • 10은 두 자리 숫자이므로 별도 처리가 필요하다.
  • * 옵션은 현재 점수뿐 아니라 이전 점수에도 영향을 준다.
  • 각 회차 점수를 배열에 저장하면 옵션 처리가 쉬워진다.
728x90

'코테(Solved.ac + Programmers)' 카테고리의 다른 글

프로그래머스 택배 상자 꺼내기 JAVA 풀이 (2025 코드 챌린지)  (0) 2026.07.07
프로그래머스 문자열 안의 숫자 더하기 JAVA 풀이 (문자열, 구현, 아스키코드)  (0) 2026.07.05
프로그래머스 PCCE 기출문제 10번 데이터 분석 JAVA 풀이 (구현, 정렬)  (0) 2026.07.03
프로그래머스 체육복 JAVA 풀이 (그리디, 구현)  (0) 2026.07.02
프로그래머스 완주하지 못한 선수 JAVA 풀이 (HashMap, 해시)  (0) 2026.07.01
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
  • 프로그래머스 택배 상자 꺼내기 JAVA 풀이 (2025 코드 챌린지)
  • 프로그래머스 문자열 안의 숫자 더하기 JAVA 풀이 (문자열, 구현, 아스키코드)
  • 프로그래머스 PCCE 기출문제 10번 데이터 분석 JAVA 풀이 (구현, 정렬)
  • 프로그래머스 체육복 JAVA 풀이 (그리디, 구현)
PUSH → MERGE → DEPLOY
PUSH → MERGE → DEPLOY
데이터 흐름과 운영 자동화를 설계하는 백엔드 개발자
  • PUSH → MERGE → DEPLOY
    Coding Dongin
    PUSH → MERGE → DEPLOY
  • 전체
    오늘
    어제
    • MEUN
      • 코테(Solved.ac + Programmers)
      • BootCamp(JAVA)
      • JAVA
      • SpringBoot
      • JavaScript
      • JSP
      • DB(SQL)
      • React
      • HTML_CSS
      • jQuery
      • SCSS
      • GSAP
      • 설치 + 꿀팁
      • 정보처리기사 오답노트
      • 정보처리기사 기출문제
  • 블로그 메뉴

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

    • GIT
  • 공지사항

  • 인기 글

  • 태그

    정처기실기
    기출문제
    브루트포스
    피보나치
    실기
    solved.ac
    수학
    코딩테스트
    정처기
    springboot
    시뮬레이션
    정보처리기사
    Level2
    구현
    완전탐색
    백엔드개발자
    정렬
    dp
    문자열
    자료구조
    백준
    알고리즘
    자바
    프로그래머스
    level0
    배열
    정보처리기사 실기 기출문제
    level1
    정처기오답노트
    java
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.4
PUSH → MERGE → DEPLOY
프로그래머스 다트 게임 JAVA 풀이
상단으로

티스토리툴바