https://school.programmers.co.kr/learn/courses/30/lessons/17682
설명
이 문제는 처음에 문제 풀이 과정을 이해하기 어려웠다. 주어진 예시를 가지고 구현 방법을 구체화했다.
나는 풀이 과정에서
- 값을 넣을 때 ArrayList를 사용하고
- 숫자인지 문자인지 확인하는 것을 if문을 사용해서 했으며
- 10을 확인하려고, strScore 변수를 따로 두고, S와 D와 T일 때마다 초기화해주었다.
더 나은 풀이를 발견해서 공부하려고 한다.
코드
stack을 이용한 풀이 방법
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)) { // isDigit -> char 값이 숫자인지 여부 파악하여 true, false return
sum = (c - '0');
if (sum == 1 && i < dartResult.length() - 1 && dartResult.charAt(i + 1) == '0') { // 1부터 10까지 가능하니까 10을 확인하려고
sum = 10;
i++;
}
stack.push(sum);
} else {
int prev = stack.pop(); // 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;
}
}
나의 풀이
import java.util.*;
class Solution {
public int solution(String dartResult) {
int answer = 0;
List<Integer> score = new ArrayList<>();
String strScore = "";
for(int i = 0; i < dartResult.length(); i++) {
char now = dartResult.charAt(i);
if(now == 'S') { // single
score.add(Integer.parseInt(strScore));
strScore = "";
} else if(now == 'D') { // double
score.add((int) Math.pow(Integer.parseInt(strScore), 2));
strScore = "";
} else if(now == 'T') { // triple
score.add((int) Math.pow(Integer.parseInt(strScore), 3));
strScore = "";
} else if(now == '*') { // 현재와 이전에 것에 2배 곱하기
for(int j = score.size() - 1; j >= score.size() - 2; j--) {
if(j < 0) break;
score.set(j, score.get(j) * 2);
}
} else if(now == '#') { // -1 하기
score.set(score.size() - 1, score.get(score.size() - 1) * (-1));
} else {
strScore += String.valueOf(now);
}
}
for(int s : score) {
// System.out.println(s);
answer += s;
}
return answer;
}
}
반응형