본문 바로가기
알고리즘/문제 풀이

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

by 위대한초밥V 2023. 10. 25.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

설명

이 문제는 처음에 문제 풀이 과정을 이해하기 어려웠다. 주어진 예시를 가지고 구현 방법을 구체화했다.

나는 풀이 과정에서

- 값을 넣을 때 ArrayList를 사용하고

- 숫자인지 문자인지 확인하는 것을 if문을 사용해서 했으며

- 10을 확인하려고, strScore 변수를 따로 두고, S와 D와 T일 때마다 초기화해주었다.

더 나은 풀이를 발견해서 공부하려고 한다.

코드

stack을 이용한 풀이 방법

 

import java.util.*;
class Solution {
    public int solution(String dartResult) {
        Stack<Integer> stack = new Stack<>();
        int sum = 0;
        for (int i = 0; i < dartResult.length(); ++i) {
            char c = dartResult.charAt(i);
            if (Character.isDigit(c)) {	// isDigit -> char 값이 숫자인지 여부 파악하여 true, false return
                sum = (c - '0');
                if (sum == 1 && i < dartResult.length() - 1 && dartResult.charAt(i + 1) == '0') {	// 1부터 10까지 가능하니까 10을 확인하려고
                    sum = 10;
                    i++;
                }
                stack.push(sum);
            } else {
                int prev = stack.pop();	// stack에서 직전 값만 pop하고 명령 실행하기
                if (c == 'D') {
                    prev *= prev;
                } else if (c == 'T') {
                    prev = prev * prev * prev;
                } else if (c == '*') {
                    if (!stack.isEmpty()) {
                        int val = stack.pop() * 2;
                        stack.push(val);
                    }
                    prev *= 2;
                } else if (c == '#') {
                    prev *= (-1);
                }
                stack.push(prev);
            }
        }
        int totalScore = 0;
        while (!stack.isEmpty()) {
            totalScore += stack.pop();
        }
        return totalScore;
    }
}

 

나의 풀이

import java.util.*;

class Solution {
    public int solution(String dartResult) {
        int answer = 0;
        List<Integer> score = new ArrayList<>();

        String strScore = "";
        for(int i = 0; i < dartResult.length(); i++) {
            char now = dartResult.charAt(i);

            if(now == 'S') {    // single
                score.add(Integer.parseInt(strScore));
                strScore = "";
            } else if(now == 'D') { // double
                score.add((int) Math.pow(Integer.parseInt(strScore), 2));
                strScore = "";
            } else if(now == 'T') { // triple
                score.add((int) Math.pow(Integer.parseInt(strScore), 3));
                strScore = "";                
            } else if(now == '*') { // 현재와 이전에 것에 2배 곱하기
                for(int j = score.size() - 1; j >= score.size() - 2; j--) {
                    if(j < 0) break;
                    score.set(j, score.get(j) * 2);
                }
            } else if(now == '#') { // -1 하기
                score.set(score.size() - 1, score.get(score.size() - 1) * (-1));
            } else {
                strScore += String.valueOf(now);
            }
        }

        for(int s : score) {
            // System.out.println(s);
            answer += s;
        }

        return answer;
    }
}

 

반응형