https://school.programmers.co.kr/learn/courses/30/lessons/17682
문제 접근
점수를 저장할 배열과 배열의 순서를 가르키는 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;
}
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / 소수 만들기 / JAVA] (0) | 2023.03.21 |
---|---|
[프로그래머스 / [1차] 비밀지도 / JAVA] (0) | 2023.03.20 |
[프로그래머스 / 완주하지 못한 선수 / JAVA / 해시] (1) | 2023.03.17 |
[프로그래머스 / 체육복 / JAVA / 탐욕법] (1) | 2023.03.16 |
[프로그래머스 / 실패율 / JAVA] (0) | 2023.03.15 |
댓글