문제 설명
- 다트 게임은 총 3번의 기회로 구성된다.
- 각 기회마다 얻을 수 있는 점수는 0점에서 10점까지이다.
- 점수와 함께 Single(S), Double(D), Triple(T) 영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱 (점수1 , 점수2 , 점수3 )으로 계산된다.
- 옵션으로 스타상() , 아차상(#)이 존재하며 스타상() 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다. 아차상(#) 당첨 시 해당 점수는 마이너스된다.
- 스타상()은 첫 번째 기회에서도 나올 수 있다. 이 경우 첫 번째 스타상()의 점수만 2배가 된다. (예제 4번 참고)
- 스타상()의 효과는 다른 스타상()의 효과와 중첩될 수 있다. 이 경우 중첩된 스타상(*) 점수는 4배가 된다. (예제 4번 참고)
- 스타상(*)의 효과는 아차상(#)의 효과와 중첩될 수 있다. 이 경우 중첩된 아차상(#)의 점수는 -2배가 된다. (예제 5번 참고)
- Single(S), Double(D), Triple(T)은 점수마다 하나씩 존재한다.
- 스타상(*), 아차상(#)은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다.
- 0~10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.
입력 형식
"점수|보너스|[옵션]"으로 이루어진 문자열 3세트.
예) 1S2D*3T
- 점수는 0에서 10 사이의 정수이다.
- 보너스는 S, D, T 중 하나이다.
- 옵선은 *이나 # 중 하나이며, 없을 수도 있다.
출력 형식
3번의 기회에서 얻은 점수 합계에 해당하는 정수값을 출력한다.
예) 37
다트 게임 문제 코드 흐름 정리
1. 주어진 정규식을 갖는 패턴을 생성한다.
Pattern pattern = Pattern.compile("([0-9]+)([SDT])([*#]?)");
2. 대상 문자열과 패턴이 일치하는 부분을 찾는다.
Matcher matcher = pattern.matcher(dartResult);
3. stack을 이용해서 그룹별로 뽑는다.
Stack<Integer> stack = new Stack<>(); while (matcher.find()) { // matcher.group(1)에 해당하는 정보가 점수이므로 이를 number 변수에 저장해준다. int number = Integer.parseInt(matcher.group(1)); // 보너스(group(2))의 조건에 맞게 점수를 계산해준다. if (matcher.group(2).equals("D")) { number *= number; } if (matcher.group(2).equals("T")) { number *= (number * number); } // 옵션(group(3))의 조건에 맞게 점수를 변경해준다. if (matcher.group(3).equals("*")) { if (!stack.isEmpty()) { int top = stack.pop(); stack.push(top * 2); } number *= 2; } if (matcher.group(3).equals("#")) { number *= -1; } stack.push(number); }
while(matcher.find())
find() 메서드는 패턴이 일치하는 다음 문자열이 존재한다면 true를 반환하기 때문에 while문을 사용하면 문자열의 끝까지 조회가 가능하다.matcher.group(1)
1번째 그룹의 문자열을 반환한다. 다트 게임 문제에서는 점수에 해당하는 문자열이다.matcher.group(2)
2번째 그룹의 문자열을 반환한다. 다트 게임 문제에서는 보너스(S, D,T)에 해당하는 문자열이다.matcher.group(3)
3번째 그룹의 문자열을 반환한다. 다트 게임 문제에서는 옵션(*, #)에 해당하는 문자열이다.stack.pop()
stack의 가장 윗 데이터를 반환한다. 만약 stack이 비었다면 이 연산은 정의 불가 상태이다.stack.push()
stack의 가장 윗 데이터로 top이 가리키는 자리 위에 (top = top + 1) 메모리를 생성한다.
참고한 코드 출처