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