PS/Level1
[1차] 다트 게임
우봉수
2023. 2. 2. 13:44
<풀기 전 생각>
문자열의 조합이라 정규식을 활용하여 각 3번의 횟수의 대한 문자열을 나눌까도 생각하였지만
처음에 0~10이 아닌 1~9 까지의 숫자가 들어온다고 착각하여 각 문자 하나당 처리하면 쉽게 풀 수 있을 것 같아
toCharArray()를 사용하여 문자열을 split()을 사용한 것 보다 빠르게 한 글자씩 채취해서
처리하고자 하였다.
<중간 문제점>
toCharArray()를 통해 char 타입으로 한 글자씩 추출 한 것은 좋았으나 Integer.parseInt()는 String 타입만을 지원하기 때문에 어떻게 해야 하나 고민 하였는데 간단히 +"" 공백을 추가하는 것으로 문자열로 바꾸어 해결 할 수 있었다.
10이 문자열에 포함되어 있어서 if문 하나를 추가해서 해결 하였지만
극단적으로 0~10 까지의 값 만을 가지고 답을 만들 수 있어 유연하지는 못 하게 된 것 같다.
<전체 코드>
class Solution {
// 시간 복잡도 O(n) 공간 복잡도 O(n)
public int solution(String dartResult) {
int answer = 0;
char charArray[] = dartResult.toCharArray();
// 얻을 수 있는 point는 3종류 이지만 * 아이템을 처리 하기위해 맨 앞에 공간을 하나 더 만들어줌
int points[] = new int[4];
int turn = 1;
int point = 0;
for(int i=0;i<charArray.length;i++){
// 점수 부분
if(charArray[i]>='0'&&charArray[i]<='9') {
if(charArray[i+1]>='0'&&charArray[i+1]<='9')
point += Integer.parseInt(charArray[i]+""+charArray[i+1]+"");
else
point += Integer.parseInt(charArray[i] + "");
}
// 점수 보너스 부분
else if(charArray[i]=='S'||charArray[i] == 'D'||charArray[i] == 'T'){
if (charArray[i] == 'S')
point = (int)Math.pow(point, 1);
else if (charArray[i] == 'D')
point = (int)Math.pow(point, 2);
else
point = (int)Math.pow(point, 3);
// 만약 다음 문자가 없거나 특수 문자가 아니라면 해당 점수를 저장하고 다음 점수로 파트로 넘아감
if(i+1==charArray.length||(charArray[i+1]>='0'&&charArray[i+1]<='9')){
points[turn] = point;
turn++; point=0;
}
}
// 특수 아이템 부분
else{
if(charArray[i]=='*') {
point *= 2;
points[turn-1]*=2;
}
else
point*=-1;
points[turn] = point;
point=0;
turn++;
}
}
for (int num: points) {
answer+=num;
}
return answer;
}
}
<메모>
Character.isDigit() 라는 함수를 통해 해당 문자가 숫자인지 아닌지 쉽게 판별이 가능해서
앞으로는 (charArray[i]>='0'&&charArray[i]<='9') 대신 사용하면 좋을 것 같다.
해당 피턴의 정규식
String reg = "([0-9]{1,2}[S|T|D][*|#]{0,1})";
+ 해당 클래스를 사용한 아주 인상적인 풀이가 있어서 공부해두어야 할 것 같다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;