개발공부/코딩테스트 연습문제

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

ku-na 2022. 1. 13. 12:46

문제 설명과 제한사항

 

풀이

import java.util.*;
class Solution {
    public int solution(String dartResult) {
        int answer = 0;
        int tmp = 0;
        int count = 0;
        String[] dR = dartResult.split("");
        List<Integer> score = new ArrayList<Integer>();

        score.add(0);
        
        for(int i = 0; i < dR.length; i++){
            if(Character.isDigit(dartResult.charAt(i))) { 
                if(dR[i].equals("0") && dR[i-1].equals("1")) {
                    dR[i] = "10";
                }
                tmp = Integer.parseInt(dR[i]);
            }
            else {
                switch (dR[i]) {
                    case "S" :
                        score.add(tmp);
                        count++;
                        break;
                    case "D" :
                        score.add(tmp * tmp);
                        count++;
                        break;
                    case "T" :
                        score.add(tmp * tmp * tmp);
                        count++;
                        break;
                    case "*" :
                        score.add(score.get(count-1)*2);
                        score.add(score.get(count)*2);
                        score.remove(count);
                        score.remove(count-1);
                       
                        break;
                    case "#" :
                        score.add(score.get(count)*(-1));
                        score.remove(count);
                        break;
                }
            }
        }
        for(Integer s : score){
            answer += s;
        }
        return answer;
    }
}

 

++

테스트5, 테스트8 런타임 오류 잡아야한다..

 

import java.util.*;

class Solution {
    public int solution(String dartResult) {
        int answer = 0;
        int tmp = 0;
        int count = 0;
        List<Integer> score = new ArrayList<Integer>();
        String[] dR = dartResult.split("");
        
        score.add(0);
        
        for(int i = 0; i < dR.length; i++){
            if(Character.isDigit(dR[i].charAt(0))) { 
                if( i > 0 && dR[i].equals("0") && dR[i-1].equals("1")) {
                    dR[i] = "10";
                }
                tmp = Integer.parseInt(dR[i]);
            }
            else {
                switch (dR[i]) {
                    case "S" :
                        score.add(tmp);
                        count++;
                        break;
                    case "D" :
                        score.add(tmp * tmp);
                        count++;
                        break;
                    case "T" :
                        score.add(tmp * tmp * tmp);
                        count++;
                        break;
                    case "*" :
                        score.add(score.get(count-1)*2);
                        score.add(score.get(count)*2);
                        score.remove(count);
                        score.remove(count-1);
                       
                        break;
                    case "#" :
                        score.add(score.get(count)*(-1));
                        score.remove(count);
                        break;
                }
            }
        }
        for(Integer s : score){
            answer += s;
        }
        return answer;
    }
}

++ 

런타임 에러는 if(dR[i].equals("0") && dR[i-1].equals("1"))

이부분에서 잡았다. 사실 신경이 쓰이긴 했지만. 0이 처음에 왔을때 i-1을 하면 인덱스 범위에서 벗어나는 발생하는 문제였다. 

하드 코딩으로 푼 것 같은 느낌이 강한데.

1. Character.isDigit(dR[i].charAt(0)) : 문자가 숫자인지 아닌지 판단.

2. Integer.parseInt(dR[i]) : 문자열을 숫자로 반환

두개를 제외하면 기본적인 반복문과 리스트를 활용한 풀이였다.

 

++

import java.util.*;

class Solution {
    public int solution(String dartResult) {
        int answer = 0;
        int tmp = 0;
        int count = 0;
        List<Integer> score = new ArrayList<Integer>();
        String[] dR = dartResult.split("");
        
        score.add(0);
        
        for(int i = 0; i < dR.length; i++){
            if(Character.isDigit(dR[i].charAt(0))) { 
                if( i > 0 && dR[i].equals("0") && dR[i-1].equals("1")) {
                    dR[i] = "10";
                }
                tmp = Integer.parseInt(dR[i]);
            }
            else {
                switch (dR[i]) {
                    case "S" :
                        score.add(tmp);
                        count++;
                        break;
                    case "D" :
                        score.add(tmp * tmp);
                        count++;
                        break;
                    case "T" :
                        score.add(tmp * tmp * tmp);
                        count++;
                        break;
                    case "*" :
                        score.set(count-1 ,score.get(count-1)*2);
                        score.set(count, score.get(count)*2);
                        break;
                    case "#" :
                        score.set(count, score.get(count)*(-1));
                        break;
                }
            }
        }
        for(Integer s : score){
            answer += s;
        }
        return answer;
    }
}

++ 

코드가 너무 길어서 줄이고 싶었는데

List에서 값을 교체하는 내장 함수를 찾아서 사용했다.

 List<Integer> score = new ArrayList<Integer>(); 

->score.set(count-1 ,score.get(count-1)*2);

count -1 인덱스에 있는 값을 score.get(count-1)*2 로 교체한 것임.