[プログラマー]ダーツゲーム-Java


[プログラマー]ダーツ遊びに行く

問題の説明


ダーツゲーム
KakaoTalkの4番目の星!退屈な時?KakaoTalkゲームスター~
Game Star
KakaoTalkゲームスターは下半期にダーツゲームを新サービスとして発売する.ダーツゲームは、ボードに3回ダーツを投げ、点数の和で実力を競うゲームで、簡単に楽しめます.
入社したばかりの武智はコード力が認められ、ゲームの核心部分である採点ロジックを担当した.ダーツゲームの得点ロジックは以下の通りです.
  • ダーツゲームは3回のチャンスがあります.
  • の機会ごとに0点から10点を得ることができます.
  • 点は単(S)、双(D)、三(T)領域が同時に存在し、各領域で当選した場合、スコアから1平方、2平方、3平方(スコア1、スコア2、スコア3)を算出する.
  • オプションでは、スター賞()、阿差賞(#)、スター賞()の当選時に該当する点数と、それまでに獲得した点数がそれぞれ2倍になります.阿次賞(#)が当選した時、この点数は負数だった.
  • スター賞()も最初の機会に登場することができます.このような状況で、最初のスター賞()の点数は2倍になった.(例4参照)
  • スター賞()の効果は、他のスター賞()の効果と重なる可能性があります.そんな中、重なるスター賞(*)の点数は4倍.(例4参照)
  • スター賞(*)の効果は「アチャ賞」(#)の効果と重なる可能性があります.この場合、重なったアッチャ賞(#)の点数は-2倍です.(例5参照)
  • 単一(S)、二重(D)、三(T)の各スコアは1つ存在する.
  • スター賞(*)、雅察賞(#)は1点ごとに1つしか存在しないし、存在しないかもしれない.
  • 0~10の整数と、アルファベットS、D、T、*、および#からなる文字列を入力すると、合計スコアが返される関数を作成します.

    入力フォーマット


    「スコア|加算|オプション」からなる文字列3組.
    例)1 S 2 D*3 T
  • 分は0から10の整数です.
  • ボーナスはS、D、Tの1つです.
  • オプティカル(光学式)ドライブは*または#のいずれかで、ない場合があります.
  • 出力フォーマット


    3回の機会で得られたスコアの合計の整数値を出力します.
    例)37

    I/O例



    マイコード

    
    import java.util.Stack;
    
    public class Solution {
    
    	public int solution(String dartResult) {
    		int answer = 0;
    		char[] resultArr = dartResult.toCharArray();
    		// 점수를 담음 score 변수 선언
    		String score = "";
    		Stack<Integer> stack = new Stack<Integer>();
    		// 임시 점수를 담을 tempScore 선언
    		int tempScore = 0;
    		// 이전 결과를 담을 tempResult 선언
    		char tempResult = 0;
    		// *이 연속으로 나오는지 확인할 count 변수 선언
    		int count = 0;
    		
    		// 점수 계산 시작
    		for (int i = 0; i < resultArr.length; i++) {
    			// 숫자이면 실행
    			if (48 <= resultArr[i] && resultArr[i] <= 57) {
    				// 이전 결과가 *이나 #이 아니라면 answer에 바로 추가
    				if (65 < tempResult) {
    					answer += stack.peek();
    				}
    				// 점수 담기
    				score += resultArr[i];
    			// 문자이면 실행
    			} else if (65 <= resultArr[i] && resultArr[i] <= 90) {
    				// 문자 결과에 따라 다른 점수 입력
    				switch (resultArr[i]) {
    				case 83:
    					stack.push(Integer.parseInt(String.valueOf(score)));
    					break;
    				case 68:
    					stack.push((int) Math.pow(Integer.parseInt(String.valueOf(score)), 2));
    					break;
    				case 84:
    					stack.push((int) Math.pow(Integer.parseInt(String.valueOf(score)), 3));
    					break;
    				}
    				// 문자 결과가 끝나면 점수 초기화
    				score = "";
    				// 마지막 값이 문자이면 바로 answer에 값 추가
    				if (i == resultArr.length - 1) {
    					answer += stack.peek();
    				}
    			// * 이면 실행
    			} else if (resultArr[i] == 42) {
    				tempScore = stack.pop();
    				if (!stack.empty()) {
    					// *이 한 번인지 두 번인지 확인
    					answer += count > 0 ? stack.peek() * 2 : stack.peek();
    				}
    				stack.push(tempScore);
    				answer += tempScore * 2;
    				count++;
    			// # 이면 실행
    			} else if (resultArr[i] == 35) {
    				tempScore = stack.pop();
    				answer -= tempScore;
    				stack.push(-tempScore);
    				count--;
    			}
    			tempResult = resultArr[i];
    		}
    		return answer;
    	}
    
    }