다희의 코딩 성장일기

[프로그래머스] level1. [1차] 다트 게임 (자바 JAVA) 본문

Algorithm/프로그래머스

[프로그래머스] level1. [1차] 다트 게임 (자바 JAVA)

ilmiodiario 2021. 8. 26. 11:09

[ 문제 ]  [프로그래머스] level1. [1차] 다트 게임 (자바 JAVA)

 

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/17682

 

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

 

programmers.co.kr


# 접근 방법 및 풀이 

 

  • 먼저 주어진 문자열에서 10을 어떻게 처리할지 고민이었다. 보통 숫자는 0~9까진데 여기선 10점까지 있기 때문이다.
  • 그래서 String.charAt()해서 해당 문자가 정수면 뒤에꺼까지 고려하는 부분도 있지만 귀찮아서 걍 치환하기로 했다.
  • replace("10", "k"); 이렇게 10을 k로 치환했다. 그리고 다음과 같이 점수, 보너스, 옵션에 대한 String을 만들었다.
  •         String score = "0123456789k";
            String bonus = "SDT";
            String option = "*#";
  • dartResult.split("")로 String형태의 배열로 만들고 차례대로 살펴보면된다.
  • 그다음은 Stack을 이용해서 풀면된다.
  • 숫자면 스택에 넣고, 보너스가 나오면 pop()해서 보너스에 따라 제곱해주면된다.
  • 옵션일때는 주의해야할 건 "*"이다. 이건 해당점수와 이전 점수까지 2배를 해주는데, 만약 첫번째 기회에 나온다면 해당점수만 해주어야한다. 여기에 대한 분기가 필요하다.
  • 근데 다 풀고 체점 돌리니까 18번이랑 22번이 틀렸다...? 띠용하고 뭐가 문제지 하고 결국 질문하기 찾아봤다.
  • "*" 이 부분에서 틀렸는데......오마이갓....... 스택은 LIFO라는걸...까먹은건지....
  • "*" 일땐 스택에서 pop을 다음과 같이 두번 했다.
  •  int num = stack.pop()*2;
     int num2 = stack.pop()*2;
  • 그렇다면 넣는 순서는 어떻게 될까 ^^....?
  • 멍청하게 첫번째 꺼낸 num을 먼저 넣어버렸다. LIFO이므로 첫번째 꺼낸건 다음에 넣어야하는데말이다.....허허....
  • 이부분 고쳤더니 맞았다! 스택을 너무 쉽게 pop하고 아무생각 없이 쓰다보니 이런 허점이.. 충격이었다.

# 주의할 점 

 

  • 점수가 0~9가 아닌 0~10까지인 점
  • "*" 일때 스택에서 두번 pop했다면 다시 넣을 순서 고려. LIFO임
  • 스택 넣을때 뺄때 잘 고려해서 풀기

 

JAVA 코드
import java.util.*;
class Solution {
    public int solution(String dartResult) {
        int answer = 0;
        Stack<Integer> stack = new Stack<>();
        dartResult = dartResult.replace("10", "k");
        String score = "0123456789k";
        String bonus = "SDT";
        String option = "*#";
        String arr[] = dartResult.split("");
        for(int i = 0; i < arr.length; i++){
            String s = arr[i];
            if(score.contains(s)){
                int num = (s.equals("k"))? 10 : Integer.parseInt(s);
                stack.add(num);
            }
            if(bonus.contains(s)){
                int num = stack.pop();
                if(s.equals("D")){
                    num = (int) Math.pow(num, 2);
                }
                if(s.equals("T")){
                    num = (int) Math.pow(num, 3);
                }
                stack.add(num);
            }
            if(option.contains(s)){
                if(s.equals("*")){
                    if(stack.size()==1){
                        int num = stack.pop()*2;
                        stack.add(num);  
                    }else{
                        int num = stack.pop()*2;
                        int num2 = stack.pop()*2;
                        stack.add(num2);
                        stack.add(num);
                    }
                }
                if(s.equals("#")){
                    int num = stack.pop()*-1;
                    stack.add(num);  
                }
            }
        }
        while(!stack.isEmpty()){
            answer += stack.pop();
        }
        
        return answer;
    }
}

 

 

 

REVIEW

Comments