알고리즘

프로그래머스 - 다트 게임

계양 꿀주먹 2024. 5. 1. 15:58

 

 


 

 

import java.util.*;

class Solution {
    public int solution(String dartResult) {
        int answer = 0;
        List<Integer> scores = new ArrayList<>();    
        StringBuilder sb = new StringBuilder();
        int score = 0;
        
        for(char c : dartResult.toCharArray()) {
            if(Character.isDigit(c)) {  // 숫자일 때 점수 구하기
                sb.append(c);
            } else if (c == 'S' || c == 'D'|| c == 'T') {   // 영역에 따라 계산
                score = Integer.parseInt(sb.toString());
                sb = new StringBuilder();       // 기존 점수 초기화
                
                if(c == 'S') scores.add(score);
                else if(c == 'D') scores.add((int) Math.pow(score, 2));  
                else scores.add((int) Math.pow(score, 3));
            } else if (c == '*' || c == '#') {  // 옵션 계산
                if(scores.size() == 1) {        // 첫 시도일 때 옵션
                    if(c == '*') scores.set(0, scores.get(0) * 2);
                    else scores.set(0, -scores.get(0));
                } else if(scores.size() > 1) {  // 2, 3번째 시도일 때 옵션
                    if(c == '*') {          
                        scores.set(scores.size() - 1, scores.get(scores.size() - 1) * 2);
                        scores.set(scores.size() - 2, scores.get(scores.size() - 2) * 2);
                    } else {
                        scores.set(scores.size() - 1, -scores.get(scores.size() - 1));
                    }
                }
            }
        }
        
        for(int n : scores) answer += n;

        return answer;
    }
}

 

문자열로 입력받기 때문에, 문자열을 toCharArray() 메소드를 이용해 각 문자로 나누어 숫자인지 판단하여 점수와 각 옵션과 영역을 구분했습니다.

점수가 0 ~ 10 이므로 두자리 수가 될 수 있기 때문에 StringBuilder를 사용해서 영역 전까지 점수를 구하고 영역을 입력 받으면 점수를 구해 영역별 보너스 점수를 계산하여 list에 넣었습니다.

이후 옵션이 존재할 수 있기 때문에 옵션에 따라 점수를 계산해주었습니다.

 

문제를 잘 읽으면 어렵지 않은 문제였는데 지문을 놓쳐 조금 헤맨 문제였습니다.