티스토리 뷰

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

프로그래머스 17682번 - https://programmers.co.kr/learn/courses/30/lessons/17682
프로그래머스 17682번 - https://programmers.co.kr/learn/courses/30/lessons/17682

 

요구사항

1. 각 기회마다 얻을 수 있는 점수는 0점에서 10점까지이다.

2-1. 보너스는 S, D, T 중 하나이며 점수마다 하나씩 존재합니다. 

2-2. S는 점수의 1제곱, D는 점수의 2제곱, T는 점수의 3제곱이다.

3-1. 옵션은 * 이나 # 중 하나이다.

3-2. '*' 옵션은 해당 기회에서 획득한 점수를 -1배로 만든다.

3-3. '#' 옵션은 해당 기회에서 획득한 점수와 바로 전에 얻은 점수를 각 2배로 만든다.

4. 3번의 기회에서 얻은 점수 합계를 반환하라.

 

요구사항 분석 및  풀이과정

1. 보너스는 점수마다 하나씩 존재하므로 보너스를 기준으로 점수와 옵션을 구분한다.

2. 옵션이 없는 경우는 점수의 보너스에 해당하는 제곱을 하여 합계에 더한다.

3. '*' 옵션이 있는 경우 바로 전에 얻은 점수와 해당 기회에서 획득한 점수를 2배하여 합계에 더한다.

 

바로 전에 얻은 점수도 2배하여 더해주는 것이 아니라 그냥 더해주는 이유는 바로 전 기회에서 이미 더해졌기때문에 한번만 더하면 2배를 한 것과 동일하다.

 

4. '#' 옵션이 있는 경우는 해당 기회에서 획득한 점수를 -1배하여 합계에 더한다.

 

소스코드 작성

class Solution {
    
    private int bonus(char value) {
        switch (value) {
            case 'S':
                return 1;
            case 'D':
                return 2;
            case 'T':
                return 3;
            default:
                return -1;
        }
    }
    
    private boolean matchBonus(char value) {
        return (value == 'S' || value == 'D' || value == 'T');
    }
    
    private boolean existsOption(char value) {
        return (value == '#' || value == '*');
    }
    
    private int option(char value) {
        return value == '#' ? -1 : 2;
    }

    public int solution(String dartResult) {
        char[] chars = dartResult.toCharArray();
        int result = 0, start = 0, end = 0;
        int prevScore = 0;
        
        while(start < chars.length - 1) {
            if (!matchBonus(chars[end])) {
                end++;
                continue;
            }
            
            int score = Integer.parseInt(dartResult.substring(start, end));
            int stageScore = (int)Math.pow(score, bonus(chars[end]));

            if (end + 1 >= chars.length) {
                result += stageScore;
                break;
            }
            
            if (existsOption(chars[end + 1])) {
                int option = option(chars[end + 1]);
                stageScore = stageScore * option;
                result += ((option < 0 ? 0 : prevScore) + stageScore);       
                end = start = end + 2;
            } else {
                result += stageScore;
                end = start = end + 1;
            }
            
            prevScore = stageScore;
        }
        
        return result;
    }
}

 

결과

 

소스코드 깃허브 주소

링크

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
29 30
글 보관함