https://school.programmers.co.kr/learn/courses/30/lessons/17682
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 풀이방법[알고리즘]
입력받은 String을 나눠서 점수를 계산하는 문제. 점수/보너스/옵션 순으로 값이 나오는데 2가지 부분을 주의해야 한다.
1. 점수는 1~10이기 때문에 2자리가 나올 수 도 있다는 점
2.옵션은 있을수도 없을 수도 있기 때문에 idx의 번호를 잘 체크해야한다는 점.
처음에 for문으로 돌리다가 idx 계산이 헷갈려서 while문에 넣고 idx를 처리해주었다. charAt으로 한글자씩 나눠서 값을 계산하는데, Character 클래스의 isDigit과 getNumericValue 메서드를 사용해서 숫자 값 호환을 쉽게할 수 있었다.
옵션으로 나오는 값중 *는 앞의 값에도 영향을 미쳐서, 바로 값을 뽑을 수 있는 stack에 추가해주었다. 계산이 다 끝난후 stack에 들어있는 값을 다 더 하면 끝!
import java.util.*;
public class P17682다트게임_240329 {
class Solution {
public int solution(String dartResult) {
int answer = 0;
char ch = ' ';
int score=0;
int square=0;
int size=0;
int idx=0;
int strLength = dartResult.length();
Stack<Integer>stack = new Stack();
while(idx<strLength-1){
//점수
ch = dartResult.charAt(idx);
if(Character.isDigit(ch)){
score = Character.getNumericValue(ch);
}//if
//보너스
ch = dartResult.charAt(++idx);
if(ch=='0'){
score=10;
ch = dartResult.charAt(++idx);
}
switch(ch){
case 'S':
square = 1;
break;
case 'D':
square = 2;
break;
case 'T':
square = 3;
break;
}
score = (int)Math.pow(score,square);
if(idx>strLength){
break;
}
//옵션
if(idx+1>=strLength){
stack.add(score);
break;
}
ch = dartResult.charAt(++idx);
if(Character.isDigit(ch)){
stack.add(score);
}else{
size = stack.size();
switch(ch){
case '*':
if(size>0){
int tmp = stack.pop();
tmp*=(2);
stack.add(tmp);
}
stack.add(score*2);
break;
case '#':
stack.add(score*(-1));
break;
}//switch
idx++;
}//if
}//for
for(int num:stack){
answer+=num;
}
return answer;
}
}
}
'알고리즘 문제 > JAVA' 카테고리의 다른 글
[백준]7785:회사에 있는 사람(JAVA) (0) | 2024.04.16 |
---|---|
[프로그래머스]42889:실패율(JAVA) (0) | 2024.04.16 |
[프로그래머스]250137:붕대감기(JAVA) (0) | 2024.03.11 |
[백준]16928:뱀과 사다리게임(JAVA) (1) | 2024.01.23 |
[백준]1012:유기농배추(JAVA) (0) | 2024.01.18 |