프로그래머스 | 다트 게임 (Java)

mul·2023년 2월 3일
0

알고리즘

목록 보기
9/65
post-custom-banner

🔒 문제

프로그래머스 Lv.1 [1차] 다트게임

🔑 해결

0~10의 정수와 문자 S,D,T,*,#로 구성된 문자열을 매개변수로 받아 총점수를 반환하는 함수를 작성하는 문제이다.

문자열을 숫자인지, 보너스인지, 옵션인지 판별하고 점수를 계산한다. 변수 num에 숫자를 넣어두고 다음 문자가 숫자일 경우 두자리 숫자로 판단, 다음 문자가 보너스일 경우 한자리 숫자로 판단하고 num을 0으로 초기화한다. 보너스 문자가 나와야 숫자가 나오는 부분이 끝난 것으로 판단하고 n을 증가시킨다.

  1. 점수를 계산할 score 배열을 선언.
  2. for문을 돌려 i번째 문자를 c에 저장.
  3. c가 0~9 사인 숫자이면, int형인 ic에 형변환하여 저장.
    3-1. char를 String으로 먼저 변환(String.valueOf(c))한 후, String을 int로 변환(Integer.parseInt()).
    3-2. ic가 0이고, num이 0이상이면, 바로 이전 문자가 숫자라는 의미로 두자리 숫자라 판단. 저장해둔 num에 10을 곱하고 ic를 더한 값을 score[n]에 저장.
    3-3. 조건에 해당하지 않으면 num과 score[n]에 ic를 저장.
  4. c가 S/D/T인 보너스라면, num을 0으로 초기화. 숫자가 나오는 부분이 끝난 것으로 판단하고 n을 증가시킨다.
    4-1. D일 경우 점수의 2제곱.
    4-2. T일 경우 점수의 3제곱.
  5. c가 일 경우
    5-1. 첫 번째 기회(n == 1)에 스타상(
    )이 나왔다면 처음 점수에만 2배.
    5-2. 이외에는 직전 점수와 해당 점수에 2배.
  6. c가 #일 경우, 해당 점수에 -1을 곱한다.
  7. 문자열에 대한 for문이 끝났다면, score 배열에 저장된 3번의 기회의 점수를 합산.

🔓 코드

class Solution {
    public int solution(String dartResult) {
        int answer = 0;
        int[] score = new int[3];
        int n = 0;
        int num = 0;
        for (int i = 0; i < dartResult.length(); i++) {
			char c = dartResult.charAt(i);

			// 숫자 판별
			if (c >= '0' && c <= '9') {
				int ic = Integer.parseInt(String.valueOf(c));
				if (ic == 0 && num > 0) {
					score[n] = num * 10 + ic;
				} else {
					num = ic;
					score[n] = ic;
				}
			}
			
			// S, D, T 판별
			if (c == 'S' || c == 'D' || c == 'T') {
				num = 0;
				if (c == 'D') {
					score[n] = score[n] * score[n];
				} else if (c == 'T' ) {
					score[n] = score[n] * score[n] * score[n];
				}
				n++;
			}
			
			// *, # 판별
			if (c == '*') {
				if (n == 1) {
					score[0] = score[0] * 2;
				} else {
					score[n-2] = score[n-2] * 2;
					score[n-1] = score[n-1] * 2;
				}
			} else if (c == '#') {
				score[n-1] = (-1) * score[n-1];
			}
		}
        // 점수 총합
        for (int i = 0; i < score.length; i++) {
        	answer += score[i];
        }
        
        return answer;
    }
}
post-custom-banner

0개의 댓글