본문 바로가기

알고리즘 문제풀이/프로그래머스 Level 1

[2018 KAKAO BLIND RECRUITMENT[1차]/Java] 다트 게임

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

 

프로그래머스

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

programmers.co.kr

 

목차

 

카카오 문제 해설    2018 카카오 신입 공채 1차 코딩 테스트 문제 해설 링크
더보기

문자열 처리String Manipulation를 묻는 문제입니다.

앞에서부터 한 글자씩 잘라서 처리할 수 있고, 또는 간단한 컴파일러를 만들듯이 토큰화Tokenizing와 의미 분석Semantic Analysis을 통해 어렵지 않게 계산할 수 있습니다.

점수 중에는 한 자리뿐만 아니라 두 자리인 10점도 포함되어 있기 때문에 한 글자씩 잘라서 처리할때는 그 부분에 유의해야겠네요. 토큰화로 처리할 때는 정규식을 사용하면 비교적 쉽게 잘라낼 수 있습니다. S, D, T는 각각 원점수, 제곱, 세제곱으로 처리하고 스타상은 두 배로 계산하면 됩니다. 참, 아차상은 마이너스 점수라는 점에 유의하세요.

 

내 문제풀이
import java.util.Stack;

class Solution {
    public int solution(String dartResult) {
        int answer = 0;
        Stack scores = new Stack<>();
        
        for (char ch : dartResult.replace("10", "X").toCharArray()) {
            if (ch >= '0' && ch <= '9') {
                scores.push(ch - '0');
            } else if (ch == 'X') {
                scores.push(10);
            } else if (ch == 'D') {
                int score = scores.pop();
                scores.push(score * score);
            } else if (ch == 'T') {
                int score = scores.pop();
                scores.push(score * score * score);
            } else if (ch == '*') {
                int score_now = scores.pop();
                if (!scores.empty()) {
                    int score_before = scores.pop();
                    scores.push(score_before*2);
                }
                scores.push(score_now*2);
            } else if (ch == '#') {
                int score = scores.pop();
                scores.push(-score);
            }
        }
        
        for (int score : scores) {
            answer += score;
        }
        
        return answer;
    }
}

 

프로그래머스 다른사람 풀이 참고 (- , KG , 박관우 , 구진범 외 4 명 / 링크)
import java.util.*;
class Solution {
    public int solution(String dartResult) {
        Stack stack = new Stack<>();
        int sum = 0;
        for (int i = 0; i < dartResult.length(); ++i) {
            char c = dartResult.charAt(i);
            if (Character.isDigit(c)) {
                sum = (c - '0');
                if (sum == 1 && i < dartResult.length() - 1 && dartResult.charAt(i + 1) == '0') {
                    sum = 10;
                    i++;
                }
                stack.push(sum);
            } else {
                int prev = 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);
                }
                // System.out.println(prev);
                stack.push(prev);
            }
        }
        int totalScore = 0;
        while (!stack.isEmpty()) {
            totalScore += stack.pop();
        }
        return totalScore;
    }
}