본문 바로가기
알고리즘/프로그래머스

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

by KDW999 2023. 3. 19.

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

 

프로그래머스

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

programmers.co.kr

 

 

문제 접근

점수를 저장할 배열과 배열의 순서를 가르키는 count를 만들고 정해진 문자열에서 점수는 꼭 들어가는 문자라서 문자가 나올 때만 count를 증가시켜주었음

그 외엔 문자가 나올 수 있는 모든 경우를 다 계산

class Solution {
    public int solution(String dartResult) {
	        int answer = 0;
	        int[] score = {-1, -1, -1};
	        int count = 0;
	        
	        for(int i=0; i<dartResult.length(); i++) {
	        	// 숫자는 무조건 나오기에 숫자에서 count를 증가시켜준다.
	        	if(dartResult.charAt(i) == '0') {
	        		if(score[count] == -1) score[count] = dartResult.charAt(i)-48;
	        		count++;
	        	}
	        	else if(dartResult.charAt(i) == '1') {
	        		if(score[count] == -1) score[count] = dartResult.charAt(i)-48;
                    if(dartResult.charAt(i+1) == '0') {
	        			score[count] = 10;
	        			i++;
	        		}
	        		count++;
	        	}
	        	else if(dartResult.charAt(i) == '2') {
	        		if(score[count] == -1) score[count] = dartResult.charAt(i)-48;
	        		count++;
	        	}
	        	else if(dartResult.charAt(i) == '3') {
	        		if(score[count] == -1) score[count] = dartResult.charAt(i)-48;
	        		count++;
	        	}
	        	else if(dartResult.charAt(i) == '4') {
	        		if(score[count] == -1) score[count] = dartResult.charAt(i)-48;
	        		count++;
	        	}
	        	else if(dartResult.charAt(i) == '5') {
	        		if(score[count] == -1) score[count] = dartResult.charAt(i)-48;
	        		count++;
	        	}
	        	else if(dartResult.charAt(i) == '6') {
	        		if(score[count] == -1) score[count] = dartResult.charAt(i)-48;
	        		count++;
	        	}
	        	else if(dartResult.charAt(i) == '7') {
	        		if(score[count] == -1) score[count] = dartResult.charAt(i)-48;
	        		count++;
	        	}
	        	else if(dartResult.charAt(i) == '8') {
	        		if(score[count] == -1) score[count] = dartResult.charAt(i)-48;
	        		count++;
	        	}
	        	else if(dartResult.charAt(i) == '9') {
	        		if(score[count] == -1) score[count] = dartResult.charAt(i)-48;
	        		count++;
	        	}
                
	        	// 숫자를 만나면 count 증가된 상태라 -1 시켜준 상태를 생각해야한다.
	        	else if(dartResult.charAt(i) == 'D') score[count-1] = score[count-1] * score[count-1];
	        	else if(dartResult.charAt(i) == 'T') score[count-1] = score[count-1] * score[count-1] * score[count-1];
                
	        	else if(dartResult.charAt(i) == '*') { 
	        		if(count != 1) { // 첫 점수일 때
	        		score[count-2] = score[count-2] * 2;
	        		score[count-1] = score[count-1] * 2;
	        		}
	        		else score[count-1] = score[count-1] * 2;
	        	}
	        	else if(dartResult.charAt(i) == '#') score[count-1] = -score[count-1];
	        }
         
        for(int n : score) answer += n;
	
	        return answer;
	    }
}

 

다른 사람 풀이

내가 배열을 따로 만들어서 점수를 저장한 걸 이 분은 Stack을 활용하였다.

그리고 Character.isDigit()라는 char형이 숫자인지 문자인지 판별해주는 좋은 메서드가 있더라

Character.isAlphabetic()은 문자인지 판별

import java.util.*;

public 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)) { // char가 숫자인지 판별하는 메서드
                sum = (c - '0');
                // 점수가 10일 경우
                // 문자가 1이면서 i가 마지막 문자가 아니면서 i의 다음 문자가 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()) { // 첫 점수가 아니라면 점수 하나 더 꺼내서 2배
                        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;
    }
}

댓글