[java] 프로그래머스 - 다트 게임
업데이트:
문제
프로그래머스-다트 게임
3번의 다트게임에서 얻는 총 점수를 반환하는 문제.
시키는대로 하면 정답을 맞출 수 있는 문제 ~~
-
제한 사항
점수|보너스|[옵션] 으로 이루어진 문자열 3세트
점수는 0에서 10 사이의 정수다
보너스는 S, D, T 중 하나이다
옵션은 *이나 # 중에 하나이며, 없을 수도 있다 -
예시
dartResult | answer | 설명 |
---|---|---|
1S2D*3T | 37 | 1¹ * 2 + 2² * 2 + 3³ |
1D2S#10S | 9 | 1² + 2¹ * (-1) + 10¹ |
1D2S0T | 3 | 1² + 2¹ + 0³ |
풀이
문자열 3세트인것을 생각하고 풀면 간단한 문제다
idx를 사용해서 dartResult.charAt()
과 같이 반복하면서 점수/보너스/옵션을 찾는다
예시 ) 1S2D*3T
점수 : score(int), 보너스 : bonus(char), 옵션 : option(char)
먼저 idx=0
으로 놓고 시작해서 해당 자리를 숫자로 변환해 점수에 저장한다 (score:1)
두번째 idx+1을 확인해서 0이라면 점수는 10이다
점수는 0에서 10 사이의 정수
0이 아니라면 보너스이므로 보너스에 저장한다 (score:1, bonus:S)
idx+2가 문자열의 길이를 넘지않고, *이거나 #이라면 옵션에 저장한다
(score:1, bonus:S)
S는 점수의 1승이므로 해당 회차에서 얻은 점수는 1이다
…
소스코드
class Solution {
public int solution(String dartResult) {
int idx = 0;
int score;
char type, option;
int val[] = new int[3]; // 각 회차별 점수를 저장
int vIdx = 0; // 몇 회차인지 인덱스
while (idx < dartResult.length()) {
score = dartResult.charAt(idx) - '0'; // 형변환으로 문자열을 숫자로 변환
type = dartResult.charAt(idx + 1);
if (type == '0') {
score = 10;
idx++;
type = dartResult.charAt(idx + 1);
}
option = '-'; // 옵션이 없다는 뜻
if (idx + 2 < dartResult.length()) {
option = dartResult.charAt(idx + 2);
if (!(option == '*' || option == '#')) {
option = '-';
}
}
int v = getValue(score, type); // type에 따른 점수계산
if (option == '-') {
idx += 2; // 옵션이 없었다면 2자리였었으므로 2자리 후로 ㄱㄱ
} else {
idx += 3;
if(option=='*') { // 스타상 : 해당점수, 이전점수 2배
v*=2;
if(vIdx-1>-1) // 1회차가 아니였다면 이전점수에도 2배를 해준다
val[vIdx-1]*=2;
}else { // 아차상 : 해당점수 -로 계산
v *=-1;
}
}
val[vIdx]=v;
vIdx++;
}
return val[0]+val[1]+val[2];
}
private int getValue(int score, char type) {
switch (type) {
case 'S':
return score;
case 'D':
return score * score;
case 'T':
return score * score * score;
}
return 0;
}
}
댓글남기기