
내가 작성한 코드
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Solution {
public int solution(String dartResult) {
// 숫자와 대문자 사이 경계에서 문자열을 분리
String[] parts = new String[3];
Pattern pattern = Pattern.compile("\\d+[A-Z][^\\d]*"); // 숫자와 대문자 사이 경계
Matcher matcher = pattern.matcher(dartResult); // 정규 표현식으로 매칭
int[] scores = new int[3];
int index = 0;
// 매칭된 부분을 parts 배열에 저장
while (matcher.find()) {
parts[index++] = matcher.group();
}
// 각 부분을 점수로 변환
for (int i = 0; i < 3; i++) {
String part = parts[i];
String numStr = part.replaceAll("[^0-9]", ""); // 숫자만 분리
int score = Integer.parseInt(numStr);
// 점수 배율 계산
if (part.contains("S")) {
scores[i] = score;
}
if (part.contains("D")) {
scores[i] = (int) Math.pow(score, 2);
}
if (part.contains("T")) {
scores[i] = (int) Math.pow(score, 3);
}
// 보너스 처리
if (part.contains("*")) {
scores[i] *= 2;
if (i > 0) {
scores[i - 1] *= 2; // 이전 점수도 두 배로
}
} else if (part.contains("#")) {
scores[i] *= -1; // 점수 반전
}
}
return scores[0] + scores[1] + scores[2];
}
}
다른 사람의 코드
import java.util.*;
class Solution {
public int solution(String dartResult) {
Stack<Integer> stack = new Stack<>(); // 각 라운드의 점수를 저장할 스택
int sum = 0; // 현재 계산 중인 점수
// 다트 결과 문자열을 한 글자씩 순회
for (int i = 0; i < dartResult.length(); ++i) {
char c = dartResult.charAt(i);
// 숫자인 경우(점수)
if (Character.isDigit(c)) {
sum = (c - '0'); // 문자 '0'~'9'를 숫자로 변환
// 10점 처리 (1 다음에 0이 오는 경우)
if (sum == 1 && i < dartResult.length() - 1 && dartResult.charAt(i + 1) == '0') {
sum = 10;
i++; // 0을 한 번 더 건너뜀
}
stack.push(sum); // 점수를 스택에 저장
} else { // 보너스나 옵션 문자 처리
int prev = stack.pop(); // 직전 점수 꺼내기
// 보너스 처리
if (c == 'D') {
prev *= prev; // 제곱
} else if (c == 'T') {
prev = prev * prev * prev; // 세제곱
}
// 옵션 처리
else if (c == '*') {
// 이전 점수가 있으면 두 배로
if (!stack.isEmpty()) {
int val = stack.pop() * 2;
stack.push(val);
}
prev *= 2; // 현재 점수도 두 배
} else if (c == '#') {
prev *= (-1); // 현재 점수 마이너스
}
// 계산된 점수를 다시 스택에 저장
stack.push(prev);
}
}
// 스택에 남은 점수 모두 합산
int totalScore = 0;
while (!stack.isEmpty()) {
totalScore += stack.pop();
}
return totalScore;
}
}
Share article