- 내 방법 풀이
- 문제를 보고, 조건이 3가지(점수, 영역, 보너스)이므로 dartResult를 charArray로 바꿔 순회하고,
if문을 통해 경우의 수를 나누는 방식으로 풀려고 했다. - 다트 영역은 없을 수 없기 때문에 점수를 입력하면 바로 다트의 영역을 검사하는 로직으로 배열에 해당 다트 점수를 저장하도록 했다.
- 처음에는 영역검사와 보너스까지 묶어서 만들었으나, 보너스가 없는 경우에 일어나는 런타임오류로 인해 수정했다. 그래서 시작 인덱스를 -1로 변경하여, 점수 저장 후 바로 보너스 검사가 이루어져도 배열의 범위를 벗어나지 않도록 했다.
import java.util.*;
class Solution {
public int solution(String dartResult) {
// S는 1제곱, D는 2제곱, T는 3제곱
// 스타상은 해당 점수와 바로 전에 얻은 점수 2배로(중첩가능) , 앞의 점수 없을 때 해당 점수만
// 아차상은 해당 점수를 마이너스. 스타상과 아차상은 중첩 가능.
// 배열을 생성해서, 조건에 따라 배열값을 바꾸고, 마지막에 배열 순회하면서 더해주기.
int[] scores = new int[3];
int index = -1;
// 0~10 사이에 정수가 나오면, 1.영역 검사. 2.보너스상 검사
char[] arr = dartResult.toCharArray();
for (int i=0; i<arr.length; i++) {
char c = arr[i];
if (c - '0' == 1 && arr[i+1] - '0' == 0) { //#1 정수 10인경우
index++;
scores[index] = dartScore(10, arr[i+2]);
i +=2;
}
else if (c - '0' >= 0 && c - '0' <= 9) { //#2 나머지 정수의 경우
index++;
scores[index] = dartScore(c-'0', arr[i+1]);
i++;
}
else if (c == '*') { // #3 스타상
if (index == 0) {
scores[index] *= 2;
}
else {
scores[index] *= 2;
scores[index-1] *= 2;
}
}
else if (c == '#') { // #4 아차상
scores[index] *= -1;
}
}
return scores[0] + scores[1] + scores[2];
}
public int dartScore(int n, char m) {
if (m == 'S') return n;
else if (m == 'D') return n * n;
else return n * n * n;
}
}
- 다른 사람 방법 풀이 (스택활용)
- 스택을 활용해서 푼 방법이다.
- 먼저 isDigit()으로 char c가 정수인지 확인하고. 정수면 스택에 넣어준다.
- char c가 정수가 아닐 경우, 스택에 들어간 점수를 꺼내 영역 검사를 해서 로직에 맞게 처리해준다.
보너스의 경우, stack안에 다른 다트의 점수가 있을때만 꺼내서 로직에 맞게 처리해준다.
처리가 끝난 점수를 다시 스택에 push. - 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)) {
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;
}
}
'개발지 > 코테' 카테고리의 다른 글
[프로그래머스] 코테연습 - 점프와 순간 이동(lv.2) (1) | 2023.11.18 |
---|---|
[프로그래머스] 코테연습 - 폰켓몬(lv.1) (0) | 2023.11.09 |
[프로그래머스] 코테연습 - 문자열 내 맘대로 정렬하기(lv.1) (0) | 2023.11.07 |
[프로그래머스] 코테연습 - 뒤에 있는 큰 수 찾기(lv.1) (0) | 2023.10.26 |
[프로그래머스] 코테연습 - 카드 뭉치(lv.1) (1) | 2023.10.20 |