코딩테스트/프로그래머스

[1차] 다트 게임

Debin 2022. 6. 7.
반응형

아래는 문제 링크입니다.

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

 

코딩테스트 연습 - [1차] 다트 게임

 

programmers.co.kr

 

처음에 문제를 제출했을 때 오류가 발생했다.

문제를 생각해보니 모든 글자를 잘라 배열에 담으므로 10같은 경우가 1과 0 으로 담기므로 오류가 발생했다.

이 부분에서 좀 고민을 한 것 같다. 아래는 처음 작성한 답안인데 코드가 좀 더럽다..

class Solution{
    public int solution(String dartResult) {
        int answer = 0;

        ArrayList<String> arr = new ArrayList<>();
        ArrayList<Integer> score = new ArrayList<>();
        String[] split = dartResult.split("");

        String s = "";
        for(int i = 0; i <  split.length; i++){
            if(Character.isDigit(split[i].charAt(0))){
                s += split[i].charAt(0);
            }
            else{
                arr.add(s);
                arr.add(split[i]);
                s = "";
            }
        }
        for(int i = 0; i < arr.size() ; i++){
            if(arr.get(i).equals("S")){
                int num = Integer.parseInt(arr.get(i - 1));
                score.add(num);
            }
            else if(arr.get(i).equals("D")){
                int num = Integer.parseInt(arr.get(i - 1));
                score.add(num * num);

            }
            else if(arr.get(i).equals("T")){
                int num = Integer.parseInt(arr.get(i - 1));
                score.add(num * num * num);
            }
            else if(arr.get(i).equals("*")){ // 두배 두배
                if(score.size() == 1){  //첫번째 자리라면
                    int num = score.get(score.size() - 1);
                    score.remove(score.size() - 1);
                    score.add(num * 2);
                }
                else { //그 뒤라면
                   int num2 = score.get(score.size() - 2);
                    int num1 = score.get(score.size() - 1);

                    score.remove(score.size() - 2); //안에 껄 먼저 삭제
                    score.remove(score.size() - 1);
                    score.add(num2 * 2);
                    score.add(num1 * 2);
                }

            }
            else if(arr.get(i).equals("#")){
                int num = score.get(score.size() - 1);
                score.remove(score.size() - 1);
                score.add(num * - 1 );
            }
        }

        for (int i  : score) {
            answer += i ;
        }
        return answer;
    }

}

너무 불필요하고 장황하게 코드를 짠 것 같다.

그래서 이번에는 숫자가 총 3개가 들어온다는 아이디어를 이용해서 다르게 풀어보았다.

import java.util.*;

class Solution {
    public int solution(String dartResult) {
        int answer = 0;

        ArrayList<String> arr = new ArrayList<>();
        String[] word = dartResult.split("");
        int[] score = new int[3];
        String[] split = dartResult.split("[SDT*#]");

        int z = 0;
        for (String s : split) {
            if(!s.equals("")){
                score[z++] = Integer.parseInt(s);
            }
        }

        int seq = 0;

        for(int i = 0; i < word.length ; i++){
            if(word[i].equals("S")){
                seq++;
            }
            else if(word[i].equals("D")){
                int num = score[seq];
                score[seq] = num * num;
                seq++;
            }
            else if(word[i].equals("T")){
                int num = score[seq];
                score[seq] = num * num * num;
                seq++;
            }
            else if(word[i].equals("*")){ // 두배 두배
                if(seq - 1 == 0){  //첫번째 자리라면
                    int num = score[seq  - 1];
                    score[seq - 1] = num * 2;
                }
                else { //그 뒤라면
                   int num2 = score[seq - 2];
                    int num1 = score[seq - 1];

                    score[seq - 2] = num2 * 2;
                    score[seq - 1] = num1 * 2;
                }

            }
            else if(word[i].equals("#")){
                int num = score[seq  - 1];
                score[seq - 1] = num * -1;
            }
        }

        for (int i  : score) {
            answer += i ;
        }

        return answer;
    }
}

이전보다는 훨씬 깔끔하게 푼 것 같다. 시간 제한은 30분을 조금 넘겨 버렸다. 아쉽지만 실패..

다음번에 더 줄이도록 노력해보자.

반응형

댓글