문제를 보고 2가지 방식이 떠올랐다.
문자열을 하나씩 끊어서 검사해서 진행하는 방법
그리고 정규표현식으로 그룹을 나누고 계산하는 방법.
두가지 방법 모두 풀어보았다.
1. 문자열 끊어서 풀기
package progammers;
import java.util.Arrays;
import java.util.regex.Pattern;
public class DartGame {
public static void main(String[] args) {
String dartResult = "1D#2S*3S";
int answer = 0;
// 1. 문자열 마다 검사
int[] score = new int[3];
String tempString = "";
int tempNum = 0;
int idx = 0;
for (int i = 0; i < dartResult.length(); i++) {
// char를 이용해서 문자열 자르기
char c = dartResult.charAt(i);
// 숫자라면
if (c >= '0' && c <= '9') {
tempString += String.valueOf(c);
// 점수 계산
} else if (c == 'S' || c == 'D' || c == 'T') {
tempNum = Integer.parseInt(tempString);
if (c == 'S') {
tempNum = (int) Math.pow(tempNum, 1);
} else if (c == 'D') {
tempNum = (int) Math.pow(tempNum, 2);
} else {
tempNum = (int) Math.pow(tempNum, 3);
}
score[idx++] = tempNum;
tempString = "";
} else {
// 스타상, 아차상
if(c == '#') {
score[idx-1] *= -1;
} else {
score[idx-1] *= 2;
if(idx - 2 <= 0) {
score[idx - 2] *= 2;
}
}
}
}
for (int i = 0; i < score.length; i++) {
answer += score[i];
}
return answer;
}
}
2. 정규표현식을 이용해서 풀기
package progammers;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DartGame2 {
public static void main(String[] args) {
String dartResult = "1D#2S*3S";
int answer = 0;
// 2. 정규표현식으로 그룹별로 나누고 계산
// 패턴 컴파일
Pattern pattern = Pattern.compile("([0-9]+)([SDT])([*#]?)");
// 컴파일된 패턴 검사
Matcher matcher = pattern.matcher(dartResult);
// 스텍을 이용해서 그룹별로 뽑기
Stack<Integer> stk = new Stack<>();
while(matcher.find()) {
// 점수
int num = Integer.parseInt(matcher.group(1));
// 점수 곱하기
if (matcher.group(2).equals("D")) {
num *= num;
}
if (matcher.group(2).equals("T")) {
num *= (num * num);
}
System.out.println(stk);
// 스타상, 아차상
if (matcher.group(3).equals("*")) {
if(!stk.isEmpty()) {
int top = stk.pop();
stk.push(top * 2);
}
num *= 2;
}
if (matcher.group(3).equals("#")) {
num *= -1;
}
stk.push(num);
}
while(!stk.isEmpty())
answer += stk.pop();
return answer;
}
}
'코딩 테스트' 카테고리의 다른 글
(Java) 프로그래머스 두 정수 사이의 합 (0) | 2021.11.05 |
---|---|
(Java) 프로그래머스 이상한 문자 만들기 (0) | 2021.11.05 |
(Java) 프로그래머스 피보나치 수 (0) | 2021.10.19 |
(Java) 프로그래머스 JadenCase (0) | 2021.10.19 |
(Java) 프로그래머스 가장 큰 수 (0) | 2021.10.19 |