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 |
