문제링크
코드
import java.util.*;
class Solution {
public int solution(String dartResult) {
String[] split = dartResult.split("");
Stack<Integer> stack = new Stack<>();
int result = 0;
for(int i = 0; i < split.length; i++){
String s = split[i];
if(s.equals("0")){
stack.add(0);
continue;
}
if(s.equals("1") && split[i+1].equals("0")){
s = "10";
i++;
}
int qqwe = 0;
if(s.chars().allMatch(Character::isDigit)){//숫자이면
if(split[i+1].equals("S")){
qqwe += Math.pow(Integer.parseInt(s),1);
stack.add(qqwe);
}
if(split[i+1].equals("D")){
qqwe += Math.pow(Integer.parseInt(s),2);
stack.add(qqwe);
}
if(split[i+1].equals("T")){
qqwe += Math.pow(Integer.parseInt(s),3);
stack.add(qqwe);
}
}
if(split[i].equals("#")){
int i1 = stack.pop() ;
stack.add(i1 * -1 );
}
if(split[i].equals("*")){
if(stack.size() == 1) {
int i1 = stack.pop() ;
stack.add(i1 * 2);
continue;
}
int i1 = stack.pop() ;
int i2 = stack.pop() ;
stack.add(i2 * 2);
stack.add(i1 * 2);
}
}
for (Integer integer : stack) {
result += integer;
}
return result;
}
}
어떤점이 어려웠나?
문제를 푸는 과정에서 문자열을 나눠서 시작했습니다.
3번의 기회에서 얻은 점수를 stack에다 넣어서 관리합니다.
*를 만나면 2번 pop해서 2를 곱한다음에 넣어줍니다. 만약 첫번째 기회때 *가 올 수도 있으니 stack의 size가 1일때 처리를 해줍니다.
#를 만나면 1번 pop해서 -1을 곱한 다음 다시 stack에 넣어줍니다.
문자열을 하나씩 쪼개서 for문을 돌 때 숫자이면 그 다음 문자를 판별하게 되어있습니다. 이때 0, 10의 처리를 따로해주어야 합니다.
0일 때는 그냥 stack에 0을 넣습니다.
10일때는 stack에 10을 넣고 다음 문자를 판별하기 위해 i++합니다. 그러면 글자가 있을것입니다.
728x90
'알고리즘 > Programmers' 카테고리의 다른 글
[Programmers / Java] 게임 맵 최단거리 (DFS/BFS) (0) | 2022.06.11 |
---|---|
[Programmers / Java] 소수 구하기(조합) (0) | 2022.05.24 |
[Programmers / Java] 멀쩡한 사각형 (0) | 2022.05.07 |
[Programmers / Python] 메뉴 리뉴얼 (0) | 2022.03.04 |
[Programmers / Python] 괄호변환 (0) | 2022.03.03 |