728x90
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/17682
📚 문제
💻 입출력 형식
💡 아이디어
✅ 숫자 이외의 문자들로 구분하여(split) 숫자 배열을 구합니다.
문제의 조건을 살펴보면, 입력형식은 '점수|보너스|[옵션]'으로 이루어진 문자열 3세트라고 되어있습니다.
여기서 주의해야 할 점은 2가지입니다.
- 숫자는 1~2자리가 올 수 있다. → 점수는 0~10 사이의 정수
- 옵션은 있을 수도, 없을 수도 있다.
위와 같은 조건으로 인해 무조건 한 글자씩 끊어서 구분하기에는 어렵다는 것을 파악할 수 있습니다.
따라서, 저는 정해져있는 '보너스'와 '옵션'의 문자들을 기준으로 구분하여 점수 데이터를 먼저 얻고자 했습니다.
String[] tmp = dartResult.split("S|D|T|\\*|#")
와 같이 조건을 설정한다면, tmp 배열에는 String 형태인 숫자, 혹은 빈 문자열로 구성될 것입니다.
✨ 잠깐, 왜 빈 문자열이 나오는지 궁금한 분들은 링크를 참고하세요!
✅ 숫자를 구했다면, 문자를 기준으로 그 값을 업데이트합니다.
이제 주어진 dartResult를 한 문자씩 끊어서 보기 시작합니다.
만약 0~9 사이의 문자라면 넘어가고, 그 외의 경우는 switch case문으로 조건에 맞게 수를 업데이트합니다.
1. S
- 1제곱이므로 그대로 넘어가도 무방합니다.
2. D
- 2제곱이므로,
num[idx] = (int)Math.pow(num[idx], 2)
와 같이 업데이트합니다.
3. T
- 3제곱이므로, `num[idx] = (int)Math.pow(num[idx], 3)`와 같이 업데이트합니다.
4. *
- 해당 점수와, 바로 전에 얻은 점수를 각 2배로 만듭니다.
- 여기서 주의할 점 2가지
- 이 문자는 옵션이므로, 바로 전에 S / D / T 중 하나의 문자가 위치해 있을 것입니다.
그러므로 실제 해당 점수를 구하기 위해서는 idx--로 idx 값을 전 상태로 되돌려줘야 합니다.
조금 더 이해가 쉽게, '1S2D*3T'라는 예시를 들어서 설명하겠습니다.
1) `dartResult[0] = 1` → 숫자이므로 넘어감(idx : 0)
2) `dartResult[1] = S` → 1제곱이라 넘어감(idx : 0 → idx : 1)
3) `dartResult[2] = 2` → 숫자이므로 넘어감(idx : 1)
4) `dartResult[3] = D` → 2제곱이므로 계산해서 Update해줌(idx : 1 → idx : 2)
5) `dartResult[4] = *` → 4)의 과정에서 idx = 2가 되었지만, 실제로 업데이트해야 하는 수의 index는 1입니다.
현재 코드에서는 switch문이 끝날 때마다 idx++을 해주고 있습니다.
옵션은 말 그대로 옵션이기 때문에 올 수도, 안 올 수도 있습니다. 코드에서는 항상 문자를 만나면 index를 증가하게끔 했으므로, 옵션을 만나게 되면 index에서 1을 빼주어서 원래의 index로 되돌려야 하는 것입니다. - *이 첫번째 기회에서 나온다면, '해당 점수'는 있지만, '바로 전에 얻은 점수'는 없습니다.
그렇기 때문에 `idx - 1 >= 0`인지 확인이 필요한 것입니다.idx--; num[idx] *= 2; if(idx - 1 >= 0) num[idx - 1] *= 2;
- 이 문자는 옵션이므로, 바로 전에 S / D / T 중 하나의 문자가 위치해 있을 것입니다.
5. #
- 해당 점수가 마이너스됩니다.
- *와 마찬가지로 옵션이므로, idx--를 동일하게 진행해주어야 합니다.
idx--; num[idx] *= -1;
👩🏻💻 Java 풀이
class Solution {
public int solution(String dartResult) {
int answer = 0;
String[] tmp = dartResult.split("S|D|T|\\*|#");
int[] num = new int[3];
int idx = 0;
for(int i = 0; i < tmp.length; i++) {
System.out.println(tmp[i]);
if(!tmp[i].equals("")) {
num[idx++] = Integer.parseInt(tmp[i]);
}
}
idx = 0;
for(int i = 0; i < dartResult.length(); i++) {
char c = dartResult.charAt(i);
if(c >= '0' && c <= '9') {
continue;
} else {
switch(c) {
case 'S':
break;
case 'D':
num[idx] = (int)Math.pow(num[idx], 2);
break;
case 'T':
num[idx] = (int)Math.pow(num[idx], 3);
break;
case '*':
idx--;
num[idx] *= 2;
if(idx - 1 >= 0) num[idx - 1] *= 2;
break;
case '#':
idx--;
num[idx] *= -1;
break;
}
idx++;
}
}
for(int i = 0; i < 3; i++) {
answer += num[i];
}
return answer;
}
}
🎨 다른 풀이
class Solution {
public int solution(String dartResult) {
int char_idx = 0;
int arr_idx = -1;
int[] arr = new int[3];
while(char_idx < dartResult.length()) {
char now = dartResult.charAt(char_idx);
if(now >= '0' && now <= '9') {
if(arr_idx < 2) {
arr_idx++;
}
if(char_idx + 1 < dartResult.length() && dartResult.charAt(char_idx + 1) == '0') {
arr[arr_idx] = 10;
char_idx++;
} else {
arr[arr_idx] = now - '0';
}
char_idx++;
continue;
}
switch(now) {
case 'S':
arr[arr_idx] *= 1;
break;
case 'D':
arr[arr_idx] = (int)Math.pow(arr[arr_idx], 2);
break;
case 'T':
arr[arr_idx] = (int)Math.pow(arr[arr_idx], 3);
break;
case '*':
if(arr_idx != 0) {
arr[arr_idx - 1] *= 2;
}
arr[arr_idx] *= 2;
break;
case '#':
arr[arr_idx] *= (-1);
break;
}
char_idx++;
}
return arr[0] + arr[1] + arr[2];
}
}
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);
}
stack.push(prev);
}
}
int totalScore = 0;
while (!stack.isEmpty()) {
totalScore += stack.pop();
}
return totalScore;
}
}
class Solution {
public int solution(String dartResult) {
char[] dart = dartResult.toCharArray();
int[] game = new int[3];
int idx = -1;
for(int i = 0; i < dart.length; i++) {
if(dart[i] >= '0' && dart[i] <= '9'){
idx++;
if(dart[i] == '1' && dart[i + 1] == '0') {
game[idx] = 10;
i++;
} else {
game[idx] = dart[i] - '0';
}
}
if(dart[i] == 'D') {
game[idx] *= game[idx];
} else if(dart[i] == 'T') {
game[idx] *= game[idx] * game[idx];
} else if(dart[i] == '*') {
if(idx > 0) {
game[idx - 1] *= 2;
}
game[idx] *= 2;
} else if(dart[i] == '#') {
game[idx] *= -1;
}
}
return game[0] + game[1] + game[2];
}
}
🔗 참고 링크
※ 끝까지 봐주셔서 감사합니다. 오류에 대한 지적은 언제나 환영입니다😊
728x90