Notice
Recent Posts
Recent Comments
Link
Welcome! Everything is fine.
[프로그래머스/Lv.1] 다트 게임(2018 KAKAO BLIND RECRUITMENT) - Java 본문
728x90
📌 문제
📌 풀이
이 문제는 문자열 처리를 묻는 문제였다. 어찌저찌 구현은 했지만 파고파고 들어가는 depth와 과한 if - else 문의 향연..이게 맞나 싶었지만 정답이긴 했다. 그냥 직관적으로 무식하게 짜서 그런지 속도도 꽤 빠르다..^^ 우선 내가 푼 순서의 흐름을 정리해보겠다.
- 세 차례의 게임 후 얻는 점수를 저장할 배열을 만든다.
- "점수|보너스|[옵션]" 으로 이루어진 문자열 dartResult를 순회한다.
- dartResult.charAt(i)가 숫자일 경우
- 그 다음 문자가 숫자일 경우(= 점수가 10점인 경우)
- 보너스가 Single일 경우 : 점수 배열에 10 저장
- 보너스가 Double일 경우 : 점수 배열에 100 저장
- 보너스가 Triple일 경우 : 점수 배열에 1000 저장
- 그 다음 문자가 숫자가 아닐 경우
- 보너스가 Single일 경우 : 점수 배열에 i를 저장
- 보너스가 Double일 경우 : 점수 배열에 i의 제곱 저장 → Math.pow(점수, 2)
- 보너스가 Triple일 경우 : 점수 배열에 i의 세제곱 저장 → Math.pow(점수, 3)
- 그 다음 문자가 숫자일 경우(= 점수가 10점인 경우)
- 옵션이 스타상(*)이라면
- indexOf(찾을 문자, 시작 지점) 활용
- 스타상(*)이 첫 번째 기회에서 나왔을 경우
- 첫 번째 점수에 2를 곱하기
- 스타상(*)이 두 번째 기회에서 나왔을 경우
- 첫 번째 점수에 2를 곱하기
- 두 번째 점수에 2를 곱하기
- 스타상(*)이 세 번째 기회에서 나왔을 경우
- 두 번째 점수에 2를 곱하기
- 세 번째 점수에 2를 곱하기
- 옵션이 아차상(#)이라면
- indexOf(찾을 문자, 시작 지점) 활용
- 아차상(#)이 첫 번째 기회에서 나왔을 경우
- 첫 번째 점수에 -1을 곱하기
- 아차상(#)이 두 번째 기회에서 나왔을 경우
- 두 번째 점수에 -1을 곱하기
- 아차상(#)이 번째 기회에서 나왔을 경우
- 세 번째 점수에 -1을 곱하기
- dartResult.charAt(i)가 숫자일 경우
- 완성된 점수 배열의 요소를 모두 더해 합한다.
📌 전체 코드
class Solution {
public int solution(String dartResult) {
int answer = 0;
int[] arr = new int[3];
int idx = 0;
for (int i = 0; i < dartResult.length(); i++) {
if (Character.isDigit(dartResult.charAt(i))) { // 숫자일 경우
if (Character.isDigit(dartResult.charAt(i + 1))) { // 그 다음 문자도 숫자일 경우(= 점수가 10일 경우)
if (dartResult.charAt(i + 2) == 'S') {
arr[idx++] = 10;
} else if (dartResult.charAt(i + 2) == 'D') {
arr[idx++] = 100;
} else if (dartResult.charAt(i + 2) == 'T') {
arr[idx++] = 1000;
}
i++;
} else { // 그 다음 문자는 숫자가 아닐 경우
if (dartResult.charAt(i + 1) == 'S') {
arr[idx++] = Character.getNumericValue(dartResult.charAt(i));
} else if (dartResult.charAt(i + 1) == 'D') {
arr[idx++] = (int) Math.pow(Character.getNumericValue(dartResult.charAt(i)), 2);
} else if (dartResult.charAt(i + 1) == 'T') {
arr[idx++] = (int) Math.pow(Character.getNumericValue(dartResult.charAt(i)), 3);
}
}
}
if (dartResult.charAt(i) == '*') { // 옵션이 스타상일 경우
if (dartResult.indexOf('*', i) == 2) {
arr[0] *= 2;
} else if (dartResult.indexOf('*', i) < 6 && dartResult.indexOf('*', i) >= 4) {
arr[0] *= 2;
arr[1] *= 2;
} else if (dartResult.indexOf('*', i) >= 6) {
arr[1] *= 2;
arr[2] *= 2;
}
} else if (dartResult.charAt(i) == '#') { // 옵션이 아차상일 경우
if (dartResult.indexOf('#', i) == 2) {
arr[0] *= -1;
} else if (dartResult.indexOf('#', i) < 6 && dartResult.indexOf('#', i) >= 4) {
arr[1] *= -1;
} else if (dartResult.indexOf('#', i) >= 6) {
arr[2] *= -1;
}
}
}
for (int i = 0; i < arr.length; i++) {
answer += arr[i];
}
return answer;
}
}
'프로그래머스 > Lv.1' 카테고리의 다른 글
[프로그래머스/Lv.1] 완주하지 못한 선수 - Java (0) | 2024.05.06 |
---|---|
[프로그래머스/Lv.1] 문자열 나누기 - Java (0) | 2024.05.06 |
[프로그래머스/Lv.1] 둘만의 암호 - Java (0) | 2024.04.29 |
[프로그래머스/Lv.1] 숫자 짝꿍 - Java (0) | 2024.04.27 |
[프로그래머스/Lv.1] 옹알이(2) - Java (0) | 2024.04.27 |