[java] 프로그래머스 - 다트 게임

1 분 소요

업데이트:

문제

프로그래머스-다트 게임
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;
	}
}

댓글남기기