문제링크 : https://programmers.co.kr/learn/courses/30/lessons/17682
입력형식
"점수|보너스|[옵션]"으로 이루어진 문자열 3세트.
예)1S2D*3T
- 점수는 0에서 10 사이의 정수이다.
- 보너스는 S, D, T 중 하나이다.
- 옵션은 *이나 # 중 하나이며, 없을 수도 있다.
출력형식
3번의 기회에서 얻은 점수 합계에 해당하는 정수 값을 출력한다.
풀이
점수와 보너스는 무조건 입력 형식에 등장하지만, 옵션은 나올 수도 있고 안 나올수 있다.
그렇기에 String을 char형으로 바꿔 보너스를 기준으로 조건문을 나눠 주었다.
각각 보너스 별로 조건을 나눈 것 안에 2개의 IF문 조건문이 있는데, 첫번째 조건은 아스키코드를 사용하여 숫자 10을 찾아주기 위해 조건을 걸어 두었다.
if ((i - 1 >= 0) && (i - 2 >= 0) && (((int)cDart[i - 1]) >= 48
&& ((int)cDart[i - 1]) <= 57) && (((int)cDart[i - 2]) >= 48 && ((int)cDart[i - 2]) <= 57))
String을 char형으로 바꾸는 과정에서 10은 char형으로 2개의 값을 차지 하기에
보너스를 기준으로 보너스 앞이 점수이기에 [i - 1], [i - 2]를 하여 점수가 10 점 일 때를 찾았다.
두 번째 조건에서는 삼항연산자를 사용하여 * 이나 # 보너스가 있을 시 *2 나 -1 을 곱해준다.
안에 있는 IF문은 * 보너스가 있을시 앞에 있는 점수도 2배를 해주기에 준 조건이다.
if (i + 1 < len) {
temp[tIndex] = cDart[i + 1] == '*' ? temp[tIndex] * 2
: (cDart[i + 1] == '#' ? temp[tIndex] * (-1) : temp[tIndex]);
if (cDart[i + 1] == '*' && tIndex - 1 >= 0) {
temp[tIndex - 1] *= 2;
}
}
풀이를 보면 배열의 범위를 벗어 나는 것을 방지하기 위해서 S, D, T에 같은 조건을 계속 주었는데,
뭔가 지저분한거 같아 아쉽다.
그리고 숫자 10을 String 에서 char형으로 바꾸면서 처리하기 어려웠던 문제였던거 같다.
문제 풀면서 숫자 10을 원망했었다....
class Solution {
public int solution(String dartResult) {
char[] cDart = new char[dartResult.length()];
int answer = 0, tIndex = 0, len = dartResult.length(), temp1 = 0;
int[] temp = {0,0,0};
cDart = dartResult.toCharArray();
for (int i = 0; i < len; i++) {
if (cDart[i] == 'S') {
if ((i - 1 >= 0) && (i - 2 >= 0) && (((int)cDart[i - 1]) >= 48 && ((int)cDart[i - 1]) <= 57)
&& (((int)cDart[i - 2]) >= 48 && ((int)cDart[i - 2]) <= 57)) {
temp[tIndex] = (int)Math.pow(10, 1);
i++;
} else
temp[tIndex] = (int)Math.pow(cDart[i - 1] - 48, 1);
if (i + 1 < len) {
temp[tIndex] = cDart[i + 1] == '*' ? temp[tIndex] * 2 : cDart[i + 1] == '#' ? temp[tIndex] * (-1) :temp[tIndex];
if (cDart[i + 1] == '*' && tIndex - 1 >= 0) {
temp[tIndex - 1] *= 2;
}
}
tIndex++;
} else if (cDart[i] == 'D') {
if ((i - 1 >= 0) && (i - 2 >= 0) && (((int)cDart[i - 1]) >= 48 && ((int)cDart[i - 1]) <= 57)
&& (((int)cDart[i - 2]) >= 48 && ((int)cDart[i - 2]) <= 57)) {
temp[tIndex] = (int)Math.pow(10, 2);
i++;
} else
temp[tIndex] = (int)Math.pow(cDart[i - 1] - 48, 2);
if (i + 1 < len) {
temp[tIndex] = cDart[i + 1] == '*' ? temp[tIndex] * 2 : cDart[i + 1] == '#' ? temp[tIndex] * (-1) :temp[tIndex];
if (cDart[i + 1] == '*' && tIndex - 1 >= 0) {
temp[tIndex - 1] *= 2;
}
}
tIndex++;
} else if (cDart[i] == 'T') {
if ((i - 1 >= 0) && (i - 2 >= 0) && (((int)cDart[i - 1]) >= 48 && ((int)cDart[i - 1]) <= 57)
&& (((int)cDart[i - 2]) >= 48 && ((int)cDart[i - 2]) <= 57)) {
temp[tIndex] = (int)Math.pow(10, 3);
i++;
} else
temp[tIndex] = (int)Math.pow(cDart[i - 1] - 48, 3);
if (i + 1 < len) {
temp[tIndex] = cDart[i + 1] == '*' ? temp[tIndex] * 2 : cDart[i + 1] == '#' ? temp[tIndex] * (-1) :temp[tIndex];
if (cDart[i + 1] == '*' && tIndex - 1 >= 0) {
temp[tIndex - 1] *= 2;
}
}
tIndex++;
}
}
for (int i = 0; i < 3; i++) {
answer += temp[i];
}
return answer;
}
}
'algorithm' 카테고리의 다른 글
[프로그래머스]멀쩡한 사각형 (0) | 2020.03.01 |
---|---|
[프로그래머스]기능개발 (0) | 2020.01.12 |
[프로그래머스]위장 (0) | 2020.01.08 |
[프로그래머스]프린터 (0) | 2020.01.02 |
[프로그래머스][1차]비밀지도 (0) | 2019.12.23 |