[프로그래머스] 다트 게임 (Java)

🔗 문제 링크

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


👨🏻‍💻 내가 작성한 코드

import java.util.*;
class Solution {
    public int solution(String dartResult) {
        int answer = 0;
        int count = 0; // Array에 넣은 값들의 수
        int temp;
        int result = 0; // 점수별 결과
        ArrayList<Integer> resultArr = new ArrayList<>();
        List<Integer> index = new ArrayList<>();
        StringBuilder sb = new StringBuilder(dartResult);

        
        while(sb.length() != 0) {
            // S,D,T가 들어있는 index알아내기
            temp = sb.indexOf("S");
            if (temp != -1) index.add(temp);
            temp = sb.indexOf("D");
            if (temp != -1) index.add(temp);
            temp = sb.indexOf("T");
            if (temp != -1) index.add(temp);
            int minIndex = Collections.min(index);
            char score = sb.charAt(minIndex);
            index.clear();
            
            // SDT앞에 있는 숫자 확보
            int number = Integer.parseInt(sb.substring(0, minIndex));
            
            // SDT에 따른 연산
            if(score == 'S') {
                result = number;
            } 
            else if(score == 'D') {
                result = number*number;
            }       
            else if(score == 'T') {
                result = number*number*number;
            }
            
            if (sb.length() > (minIndex+1)) {
                if (sb.charAt(minIndex+1) == '*'){
                    if (count == 0){
                        result *= 2;
                    } 
                    else {
                    	result *= 2;
                        resultArr.set(count-1, resultArr.get(count-1)*2);
                    }
                    sb.delete(0, minIndex+2);
                }
                else if (sb.charAt(minIndex+1) == '#'){
                    result *= (-1);
                    sb.delete(0, minIndex+2);
                } 
                else sb.delete(0, minIndex+1);
            }
            else sb.delete(0, minIndex+1);

            resultArr.add(result);
            count++;  
            
        }
        
        for (int i=0; i<resultArr.size(); i++) {
            answer += resultArr.get(i);
        }
        
        return answer;
    }
}


📝 결론

문제를 풀면서 최근 하반기 카카오 코딩테스 문제를 풀 때와 같이 StringIndexOutOfBoundsException오류가 많이 발생하였다. 이러한 문제는 내가 StringBuilder를 삭제하면서 마지막에 남아있는 크기를 고려하지 않아서 발생했던 것 같다.

📌StringBuilder를 삭제하며 Loop를 돌릴 때는 항상 마지막조건에 대한 index범위를 꼭 생각하자!!

또한 StringBuilder의 method들에 대해서도 다시 한번 공부해둬야겠다는 생각을 하였다.

📌 StringBuilder의 주요 Method:
append() : 문자열 맨 마지막에 문자를 추가
insert(int offset, 문자 하나) : offset위치에 문자를 추가
charAt(int index) : index위치에 있는 문자 출력
delete(int start, int end) : start부터 end-1까지 문자 제거
capacity() : StringBuilder에 할당된 크기를 반환
length() : 문자열의 길이 반환
replace(int start, int end, String str) : start부터 end-1까지 str로 변환
substring(int start, int end) : start부터 end-1까지 String형으로 반환
toString() : 문자열을 String형으로 변환

좋은 웹페이지 즐겨찾기