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 |