1) 문제 접근 방법
- 스택을 활용하는 것이 핵심인 문제이다.
- 1제곱, 2제곱, 3제곱 값은 Math.pow를 통해서 계산한 후에, int로 변환해서 스택에 저장합니다.
- *가 나왔을 때는, 스택에서 값을 꺼내서 2배를 해줍니다.
-> 이 때, 스택에 들어있는 값이 1개일 때와, 2개 이상일 때를 구분해서 계산해줍니다.
- #가 나왓을 때는, 스택에서 값을 꺼내서 -1배를 해줍니다.
- 숫자들은 String에 추가해놓고, S, D 혹은 T가 나왔을 때, int로 변환해서 계산한 후, 스택에 저장합니다.
- 최종적으로 저장된 값들을 모두 스택에서 꺼내서 더해줍니다.
import java.util.*;
class Solution {
public int solution(String dartResult) {
int answer = 0;
// 숫자를 기록하기 위한 문자열
String numStr = "";
// 스택을 선언한다.
Stack<Integer> stk = new Stack<>();
// dartResult 문자열을 순회합니다.
for(int i=0; i<dartResult.length(); i++){
// 문자 하나를 지정합니다.
char c = dartResult.charAt(i);
// 문자가 숫자인 경우는, String으로 변환해서
// numStr에 더해줍니다.
if('0'<= c && c<= '9'){
numStr += Character.toString(c);
}
// 문자열이 S, D 혹은 T인 경우
else if(c == 'S' || c == 'D' || c == 'T'){
// numStr을 int형인 num으로 변환합니다.
int num = Integer.parseInt(numStr);
int tmp = 0;
// S, D, T 각각에 대해서, 값을 계산합니다.
// 그리고 tmp에 그 값을 저장합니다.
if(c == 'S'){
tmp = (int)Math.pow(num, 1);
}else if(c == 'D'){
tmp = (int)Math.pow(num, 2);
}else if(c == 'T'){
tmp = (int)Math.pow(num, 3);
}
// tmp를 스택에 저장하고, numStr을 초기화합니다.
stk.push(tmp);
numStr = "";
}
// 문자가 '*'인 경우는, 스택에서 가장 최근 값들을 빼서(최대 2개까지)
// 2배를 해준 후에 다시 스택에 넣어줍니다.
else if(c == '*'){
if(stk.size() == 1){
int num = stk.pop();
stk.push(num*2);
}else if(stk.size() >= 2){
int num1 = stk.pop();
int num2 = stk.pop();
stk.push(num2*2);
stk.push(num1*2);
}
// 문자가 '#'인 경우는, 스택에서 가장 최근 값 한 개를 빼서,
// -1을 곱해준 후에 다시 스택에 넣어줍니다.
}else if(c == '#'){
int num = stk.pop();
stk.push(num*-1);
}
}
// 스택에 있는 모든 값들을 합해줍니다.
while(!stk.isEmpty()){
answer += stk.pop();
}
return answer;
}
}'PS' 카테고리의 다른 글
| 캐시 [프로그래머스] (0) | 2023.06.03 |
|---|---|
| 뉴스 클러스터링 [프로그래머스] (0) | 2023.06.03 |
| 실패율 [프로그래머스] (0) | 2023.06.03 |
| 오픈채팅방 [프로그래머스] (0) | 2023.06.03 |
| 알파벳 [BOJ 1987] (0) | 2022.10.10 |