알고리즘 공부/프로그래머스

프로그래머스 코딩테스트 연습 - 2018 KAKAO BLIND RECRUITMENT - [1차] 다트 게임

HRuler 2020. 10. 11. 20:15

1. 문제

https://programmers.co.kr/learn/courses/30/lessons/17682?language=java

 

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

 

programmers.co.kr

2. 나의 풀이

class Solution {
    public int solution(String dartResult) {
        int answer = 0;
		String sabon = dartResult;
		int [] imsi = new int [3];
		
		//첫 점수가 10점이거나 아닌 경우 구분하여 0번째 인덱스에 저장 후 dartResult에 나머지 문자열 저장
		if(dartResult.substring(0, 2).equals("10")) {
			imsi[0] = Integer.parseInt(dartResult.substring(0, 2));
			dartResult = dartResult.substring(2);
		}else {
			imsi[0] = Integer.parseInt(dartResult.substring(0, 1));
			dartResult = dartResult.substring(1);
		}
		
		//첫 점수의 보너스 계산
		if(dartResult.substring(0, 1).equals("S")) {
			dartResult = dartResult.substring(1);
		}else if(dartResult.substring(0, 1).equals("D")) {
			imsi[0] = imsi[0] * imsi[0];
			dartResult = dartResult.substring(1);
		}else if(dartResult.substring(0, 1).equals("T")) {
			imsi[0] = imsi[0] * imsi[0] * imsi[0];
			dartResult = dartResult.substring(1);
		}
		
		//첫 점수의 옵션이 있는 경우 계산
		if(dartResult.substring(0, 1).equals("*")) {
			imsi[0] *= 2;
			dartResult = dartResult.substring(1);
		}else if(dartResult.substring(0, 1).equals("#")) {
			imsi[0] *= -1;
			dartResult = dartResult.substring(1);
		}
		
		//두 번째 점수가 10점이거나 아닌 경우 구분하여 1번째 인덱스에 저장 후 dartResult에 나머지 문자열 저장
		if(dartResult.substring(0, 2).equals("10")) {
			imsi[1] = Integer.parseInt(dartResult.substring(0, 2));
			dartResult = dartResult.substring(2);
		}else {
			imsi[1] = Integer.parseInt(dartResult.substring(0, 1));
			dartResult = dartResult.substring(1);
		}
		
		//두 번째 점수의 보너스 계산
		if(dartResult.substring(0, 1).equals("S")) {
			dartResult = dartResult.substring(1);
		}else if(dartResult.substring(0, 1).equals("D")) {
			imsi[1] = imsi[1] * imsi[1];
			dartResult = dartResult.substring(1);
		}else if(dartResult.substring(0, 1).equals("T")) {
			imsi[1] = imsi[1] * imsi[1] * imsi[1];
			dartResult = dartResult.substring(1);
		}
		
		//두 번재 점수의 옵션이 있는 경우 계산
		if(dartResult.substring(0, 1).equals("*")) {
			imsi[0] *= 2;
			imsi[1] *= 2;
			dartResult = dartResult.substring(1);
		}else if(dartResult.substring(0, 1).equals("#")) {
			imsi[1] *= -1;
			dartResult = dartResult.substring(1);
		}
		
		//세 번째 점수가 10점이거나 아닌 경우 구분하여 1번째 인덱스에 저장 후 dartResult에 나머지 문자열 저장
		if(dartResult.substring(0, 2).equals("10")) {
			imsi[2] = Integer.parseInt(dartResult.substring(0, 2));
			dartResult = dartResult.substring(2);
		}else {
			imsi[2] = Integer.parseInt(dartResult.substring(0, 1));
			dartResult = dartResult.substring(1);
		}
				
		//세 번째 점수의 보너스 계산
		if(dartResult.substring(0, 1).equals("S")) {
			dartResult = dartResult.substring(1);
		}else if(dartResult.substring(0, 1).equals("D")) {
			imsi[2] = imsi[2] * imsi[2];
			dartResult = dartResult.substring(1);
		}else if(dartResult.substring(0, 1).equals("T")) {
			imsi[2] = imsi[2] * imsi[2] * imsi[2];
			dartResult = dartResult.substring(1);
		}
				
		//세 번재 점수의 옵션이 있는 경우 계산
		if(dartResult.equals("*")) {
			imsi[1] *= 2;
			imsi[2] *= 2;
		}else if(dartResult.equals("#")) {
			imsi[2] *= -1;
		}
		
		for(int i = 0; i < imsi.length; i = i + 1) {
			answer += imsi[i];
		}
		
		return answer;
    }
}

3. 다른 사람 풀이

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)) {
                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;
    }
}