문제 출처: https://programmers.co.kr/learn/courses/30/lessons/17682
이런 형태로 String이 입력이 되는데,
1S2D*3T
1D2S#10S
1D2S0T
1S*2T*3S
1D#2S*3S
1T2D3D#
1D2S3T*
어떠한 특정 점수 계산 로직에 의해서 답을 Integer로 출력하면 되는 문제이다.
자세한 내용은 문제를 참조
import java.util.*;
class Solution {
public int solution(String dartResult) {
int [] num = new int [3];
boolean [] numReceive = new boolean [3];
StringBuilder sb = new StringBuilder();
for(int i = 0; i < dartResult.length(); i++) {
char cur = dartResult.charAt(i);
String bonus = "SDT#*";
if(!bonus.contains("" + cur)) {
sb.append(cur);
} else {
if(sb.toString().length() > 0) {
for(int j = 0; j < numReceive.length; j++) {
if(!numReceive[j]) {
num[j] = optionCal(cur, Integer.parseInt(sb.toString()));
numReceive[j] = true;
sb.delete(0, sb.toString().length());
break;
}
}
} else {
if(optionCal2(cur)) {
if(numReceive[2]){
num[1] = optionCal(cur, num[1]);
num[2] = optionCal(cur, num[2]);
} else if(numReceive[1]) {
num[0] = optionCal(cur, num[0]);
num[1] = optionCal(cur, num[1]);
} else {
num[0] = optionCal(cur, num[0]);
}
} else {
int k = 0;
for(k = 0; k < numReceive.length; k++) {
if(!numReceive[k]) {
num[k - 1] = optionCal(cur, num[k - 1]);
break;
}
}
if(k == 3)
num[2] = optionCal(cur, num[2]);
}
}
}
}
int answer = 0;
for(int number : num) {
answer += number;
System.out.println(number);
}
return answer;
}
public static int optionCal (char cur, int num) {
if (cur == '*')
return num * 2;
if (cur == '#')
return num * -1;
if (cur == 'D')
return (int) Math.pow((double) num, 2);
if (cur == 'T')
return (int) Math.pow((double) num, 3);
return num;
}
public static boolean optionCal2 (char cur) {
return cur == '*';
}
}
총 점수 계산을 하는 stage가 3번이고
"10"이라는 두자리 숫자가 포함되어 있으며,
' * '이나오면 바로 이전 스테이지까지의 점수까지 두배가 되어
처리해주어야 할 엣지 케이스가 좀 있었지만, 전반적으로 복잡한 문제는 아니었다.
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');
if (sum == 1 && i < dartResult.length() - 1 && dartResult.charAt(i + 1) == '0') {
sum = 10;
i++;
}
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);
}
// System.out.println(prev);
stack.push(prev);
}
}
int totalScore = 0;
while (!stack.isEmpty()) {
totalScore += stack.pop();
}
return totalScore;
}
}
숫자인지 확인하는 함수 - Character.isDigit(c) 처음봄...
stack을 사용하여 효율이 좋다.. 이런 문제 유형에 스택을 사용하면 좋다는것을 배웠다..