안녕하세요. 오늘은 프로그래머스의 다트 게임 문제를 풀어보겠습니다. 이 문제는 2018년도 KAKAO BLIND RECRUITMENT에서 출제된 문제입니다.
https://programmers.co.kr/learn/courses/30/lessons/17682
재미있게 풀었던 문제였습니다. for문을 돌면서 dartResult에 저장된 값에 따라 결과를 나타냈습니다.
class Solution {
public int solution(String dartResult) {
int answer = 0; //최종 결과값
int nowNum = 0; //dartResult의 숫자 저장하는 변수
int beforeTmp = 0; //이전 결과값 저장(스타상 중첩 위해)
int tmp = 0; //현재 결과값 저장
boolean isNum = false; //숫자가 두 자리 수 이상일 경우를 위한 변수
for(int i=0; i<dartResult.length(); i++) {
char dart = dartResult.charAt(i);
switch(dart) {
case 'S': //single
tmp = nowNum;
answer += tmp;
isNum = false;
break;
case 'D': //double
tmp = nowNum*nowNum;
answer += tmp;
isNum = false;
break;
case 'T': //triple
tmp = nowNum*nowNum*nowNum;
answer += tmp;
isNum = false;
break;
case '#': //아차상
tmp = tmp*(-1);
//이미 tmp값을 더했기 때문에 tmp값의 2배를 빼준다
answer += tmp*2;
isNum = false;
break;
case '*': //스타상
//첫 번째 기회에서 스타상이 나왔을 경우 if문 탄다
if(i < 3) answer += tmp;
else answer += beforeTmp + tmp;
//tmp에 두 배를 해줘서 중첩될 수 있도록 한다
tmp = tmp*2;
isNum = false;
break;
default: //숫자
//숫자 자리수가 두자리 이상일 경우 if문 탄다
if(isNum) nowNum = nowNum*10+(dart-'0');
else {
nowNum = dart-'0';
//이전 tmp값을 저장-> 스타상 중첩 시 사용
beforeTmp = tmp;
}
isNum = true;
break;
}
}
return answer;
}
}
스타상을 중첩시키는 부분이 조금 어려웠고, 처음에 dartResult의 숫자가 0에서 9까지만 가능한 줄 알고 풀었다가 실패했습니다. 주어진 상황을 정확하게 이해하는 게 중요하다고 다시 한 번 느꼈습니다.