ToBe끝판왕

[ 프로그래머스 ] 1차 다트게임 - 자바( JAVA ) 본문

■ 알고리즘/프로그래머스

[ 프로그래머스 ] 1차 다트게임 - 자바( JAVA )

업그레이드중 2024. 5. 27. 14:06
반응형

 

 


 

[ 1차 ] 다트게임

 

•   코딩테스트 연습 > 2018 KAKAO BLIND RECRUIMENT > [ 1차 ] 다트게임

 

 

 

 

 

 

  해당 문제 링

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

 

 


 

코딩 및 문제풀이

 

 

•  자바 한 글자씩 분리하기 참고

https://baby9235.tistory.com/108#google_vignette

 

[ JAVA ] 문자열 한 글자씩 분리하기

문자열 한 글짜식 분리하기       1) String.split(x) •  지정된 문자열을 x를 기준으로 나누는 메서드 •  split("")은 문자열을 한 글자씩 나누는 것을 의미 •  문자열 배열을 반환  2) String.toCh

baby9235.tistory.com

 

 

 

class Solution {
    public int solution(String dartResult) {
        

        // 점수 합계 초기화
        int answer = 0;

        // 배열 선언 및 크기 할당 ( 다트 기회는 3번 )
        int[] scores = new int[3];

        // 다트 던지는 기회
        int cnt = 0;

        // 점수 값 담을 변수 선언 및 초기화
        int point = 0;


        // 입력값 검사 ( 점수|보너스|옵션으로 이루어진 문자열 3세트)
        for(int i=0; i < dartResult.length(); i++) {

            // 문자열 쪼개기 ( 문자열의 인덱스 i에 해당하는 문자를 char타입으로 변환 - 한글짜식 반환 )
            // for문을 통하여 i 번째 문자를 input에 대입
            char input = dartResult.charAt(i);
            

            // 점수 : 획득 가능 범위 0점 ~ 10점 영역
            // isDight() 내장함수를 사용해 숫자인지 아닌지 먼저 파악
            if(Character.isDigit(input) == true) {
                
                // if문 안의 지역변수 선언 ( input 이 숫자라면 )
                // input 값을 char > String > int 형번환하여 임시 변수에 담는다.
                int temp = Integer.parseInt(String.valueOf(input));

                // 1인 경우, 1인지 10(2자리) 인지 각각의 경우 구분 필요
                if( temp == 0 && point > 0) {

                    // 0이 반환되지만 점수가 0보다 크다 => 10인 경우
                    point = 10;
                    scores[cnt] = point;
                    
                } else {
                    // 10인 경우 제외
		    point = temp;
                    scores[cnt] = point;
                }
            }


            // 보너스 : Sigle(S), Double(D), Triple(T) 영역
            // S : 1제곱 , D : 2제곱 , T : 3제곱
            if( input == 'S' || input == 'D' || input == 'T') {

                point = 0;

                if( input == 'S') {
                    scores[cnt] = scores[cnt];

                } else if ( input == 'D') {
                    scores[cnt] = scores[cnt] * scores[cnt];

                } else if( input == 'T'){
                    scores[cnt] = scores[cnt] * scores[cnt] * scores[cnt];

                }
                cnt++;
            }


            // 옵션 : 스타상(*), 야차상(#) 영역
            if(input == '*') {

                // 첫번째 기회
                if(cnt == 1) {
                    // 첫번째에 스타상이 나오면 두배
                    // 배열값은 기회 - 1
                    scores[0] = scores[0] * 2;
                } else {
                    // 첫번째 제외하고 스타상이 나오면 각 점수 두배 > 해당점수 x 2 and  이전 점수 x 2
                    // 배열값은 기회 - 1
                    scores[cnt-1] = scores[cnt-1] * 2;
                    scores[cnt-2] = scores[cnt-2] * 2;
                }

            } else if( input == '#') {
                // 아차상이 나오면 해당점수 마이너스
                // 배열값은 기회 - 1
                scores[cnt-1] = (-1) * scores[cnt-1];

            }

        }

        // 최종 결과값 반복문으로 배열의 1, 2, 3 값의 합 대입
        for(int i = 0; i < scores.length; i++ ) {
            answer += scores[i];
        }

        return answer;
    }
}

 

 

 

•  결과화면

 

 

 

 

 

 

 

반응형
Comments