Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags more
Archives
Today
Total
관리 메뉴

공부블로그

[프로그래머스] 1차 다트게임 본문

IT/알고리즘

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

So1_b 2022. 9. 13. 13:11

https://school.programmers.co.kr/learn/courses/30/lessons/17682

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

[문제풀이]

 

- 다트 게임 횟수 == 총3회, 

  회차 별 점수 계산하기 위해 int[]을 선언한다.

  이때 회차와 인덱스를 맞추기 위해 길이를 4로 정한다.

 

- 주어진 String을 char[]로 만들어 for each문으로 하나하나 가리킨다.

- int idx는 게임 회차를 의미한다.

- flag가 true가 되면 회차변경 (idx증가)한다.

 

- for each문

  

   c가 아스키 코드 48 ~ 57의 값일 때 (숫자일 때)

  1.  점수 계산하는 변수 answer에 값을 넣어준다.

    이때 점수가 두자리일 경우를 대비해 10을 곱해 자리수를 늘리고 c-48값을 더한다. 

          * c - 48인 이유: 아스키 코드 48은 숫자 0을 의미한다. 따라서 계산을 하면 아스키 코드c가 의미하는 숫자가 나온다.

   

   2. 회차가 변경되는 기준은 보너스 영역(S/D/T) 또는 옵션 ('*' / '#')이 나온 후 숫자가 나올 때

        flag=true이면  보너스와 옵션 계산의 완료를 의미하므로 idx값을 증가시켜 회차 변경한다.

 

   c >= 68 일 때(보너스 계산)

   1. D=68, S=83, T=84

   2. D일때 제곱, T일때 세제곱 연산을 하고 flag=false로 바꾼다.

   

옵션 계산

   1. '*' = 42, '#' = 35

   2. 매개변수로 회차수, 곱해야 하는 값을 넘겨준다.

       해당 회차 점수에 곱할 값을 곱하고

       만약 곱해야하는 값이 2일경우 스타상('*')이기 때문에 

       이전 회차에도 2를 곱한다.

 

       이때 answer[]의 길이를 3회차+1으로 설정했고, 시작인덱스를 1부터 사용했기때문에 

       배열이 초과되는 일은 없다.  

import java.util.Arrays;
class Solution {
    public static int[] answer = new int[4];
	public static char[] ch;
	
	public static int solution(String dartResult) {
		ch = dartResult.toCharArray();
		int idx = 1;
		boolean flag = false; //회차 변경 플래그 defualt: false 
		
		for(int c: ch) {
			if(c > 47 && c < 58) { // 숫자 (48 ~ 57)
				if(flag == true) {
					flag = false;
					idx++; //회차 변경
				}
				answer[idx]=answer[idx]*10+(c-48);
			
			}else if(c >= 68) { // 
				flag = bonus(idx, c);
                
			}else { //option영역: 스타상(*)=42, 아차상(#)=35 
                int num = 2;
 				if(c==35) num = -1;
 				flag = option(idx, num);
			}
			
		}
        
        int sum = 0;
        for(int num: answer)
            sum += num;
        return sum;
	}//solution
    
	public static boolean option(int idx, int num) {
		answer[idx] *= num;
		if(num == 2) answer[idx-1] *= 2; //스타상 (*)
		return true; 
	}//option
    
	public static boolean bonus(int idx, int c) {
         if(c == 68) {      // 보너스: D
        	answer[idx] *= answer[idx];
        }else if(c == 84) { // 보너스: T
        	answer[idx] = answer[idx] * answer[idx] * answer[idx]; 
        }
		return true;
	}//bonus
}

숫자를 판별할 때 위 조건대신 isDigit()를 사용해도 됨

'IT > 알고리즘' 카테고리의 다른 글

[백준] 10817  (0) 2022.09.18
[백준] 2750  (0) 2022.09.18
[백준] 9012번 괄호  (0) 2022.08.24
[백준] 9093번 단어 뒤집기  (0) 2022.08.22
[프로그래머스] 체육복  (0) 2022.08.18
Comments