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

JOY·2023년 5월 2일
0

[CodingTest] Java

목록 보기
32/61
post-thumbnail

🫡 문제

프로그래머스 - 다트 게임

🫡 코드

class Solution {
    public int solution(String dartResult) {
        int answer = 0;
        int [] dart = new int[3]; //다트게임 문자열 3세트
        int idx = 0; //dart 인덱스
        String num = "";
        int convert = 0;
        int bonus = 0; // num에 보너스만큼 제곱 한 결과
        
        for(int i=0; i<dartResult.length(); i++){
            char div = dartResult.charAt(i); //문자열 나누기
            
           // System.out.println((int)div);
            //num += div - '0';
            if(div >= '0' && div <='9'){	//점수(숫자)
            	num +=  String.valueOf(div);
            }else if(div == 'S' || div=='D' || div=='T') {	//보너스
            	convert = Integer.parseInt(num);
            	if(div == 'S') { 		//1제곱
            		bonus = (int) Math.pow(convert, 1);
            	}else if(div == 'D') { 	//2제곱
            		bonus = (int) Math.pow(convert, 2);
            	}else if(div == 'T') {	//3제곱
            		bonus = (int) Math.pow(convert, 3);
            	}
            	dart[idx] = bonus; //첫번째 dart 점수 합산결과 저장
            	idx++;
            	num = "";			//다음 dart 점수 합산을 위해 빈 다트 초기화
            } else {	//옵션(필수 아님)
            	if(div == '*') {
            		dart[idx-1] *= 2;	//해당 점수 2배            		
            		//첫번째 dart라면 해당 dart점수에만 2배를 해야함
            		//첫번째 dart가 아니면 직전 dart에 2배를 할 수 있음
            		if(idx-2>=0) {//0번째 인덱스까지 2배 
            			dart[idx-2] *= 2;//이전 점수 2배	
            		} 
            	} else if(div == '#') {
            		dart[idx-1] *= (-1); //해당 점수 마이너스
            	}
            }
        }

        answer = dart[0] + dart[1] + dart[2];	//각 연산결과 합
        return answer;
    }
}

🫡 풀이

3번의 다트게임을 통한 점수를 구하는 문제.

문자열 형식(3세트): "점수|보너스|옵션"

  • 점수 : 0~10 사이 정수
  • 보너스 : S(Single, 1제곱), D(Double, 2제곱), T(Triple, 3제곱)
  • 옵션 : *(해당점수와 직전 점수 2배), #(해당점수만 *(-1))

조건

  • *는 첫번째 기회에서 나온다면 해당 점수만 2배, 중첩돼서 나온다면 4배
  • *# 가 중첩해서 나온다면 -2

dartResult 가 1S2D*3T 라면,

1번째 dart: 1S(점수,보너스)

2번째 dart: 2D*(점수,보너스,옵션)

3번째 dart: 3T(점수,보너스)

answer = 1^1*2+2^2*2+3^3

2번째 dart의 옵션 *로 인해 직전 dart의 1S의 연산결과 *2
dartResult의 문자열을 하나씩 문자로 나누어 준 후에
해당 문자가 숫자면 String으로 형 변환 후 int로 다시 변환해주어
10이 1과 0으로 나누어져 계산되지 않도록 해주었습니다.
(이부분에서 num += div - '0';코드로 작성했었다가 여러번 고뇌를 했습니다.)
제곱계산을 해주는 Math.pow() 를 사용하여 1제곱, 2제곱, 3제곱 연산을 해주었습니다.

profile
Just Do IT ------- 🏃‍♀️

0개의 댓글

관련 채용 정보