✔ 다트 게임
문제 분석하기
입력은 "점수|보너스|[옵션]"으로 이루어진 문자열 3세트이므로 숫자로 입력을 나눠서 계산
점수는 0 ~ 10,
보너스는 S(1제곱), D(2제곱), T(3제곱)
옵션은 *(해당 점수와 바로 전에 얻은 점수를 각 2배로 증가), #(해당 점수는 마이너스)
예) 1D#2S*3S
입력 | 설명 | answer |
1D#2S*3S | [1² * (-1), 0, 0] = [-1, 0, 0] | -1 |
1D#2S*3S | [-1 * 2, 2¹ * 2, 0] = [-2, 4, 0] | 2 |
1D#2S*3S | [-2, 4, 3¹] = [-2, 4, 3] | 5 |
손으로 풀어보기
- 숫자를 기준으로 입력을 나눠서 계산한 후 배열에 저장
- 보너스에 따라 현재 점수 계산
S(1제곱), D(2제곱), T(3제곱) - 옵션에 따라 현재 점수 및 이전 점수 계산
*(해당 점수와 바로 전에 얻은 점수를 각 2배로 증가), #(해당 점수는 마이너스)
- 보너스에 따라 현재 점수 계산
- 배열의 합을 반환
슈도코드 작성하기
dartResult("점수|보너스|[옵션]"으로 이루어진 문자열 3세트)
answer(3번의 기회에서 얻은 점수 합계)
points(3번의 기회 점수 배열)
index(저장 위치 인덱스) = -1
for(i -> dartResult의 길이만큼) {
now(dartResult의 i 값)
if(now가 숫자라면) {
if(now가 0이라면) {
if(index가 -1이 아니고 points[index]가 0이라면)
points[index] = 10 저장
else
points[++index] = 0 저장
}
else {
points[++index] = now 저장
}
}
else if(now가 S, D, T라면) {
if(S라면)
continue
else if(D라면)
points[index] = points[index]의 2의 제곱 저장
else
points[index] = points[index]의 3의 제곱 저장
}
else {
if(*라면) {
points[index] = points[index] * 2
if(index != 0)
points[index - 1] = points[index - 1] * 2
}
else
points[index] = points[index] * -1
}
}
for(i -> points의 길이만큼) {
answer += points[i]
}
answer 반환
코드 구현하기
/**
* 17682) 다트_게임
*/
public class L035_17682 {
// dartResult("점수|보너스|[옵션]"으로 이루어진 문자열 3세트)
public int solution(String dartResult) {
// answer(3번의 기회에서 얻은 점수 합계)
int answer = 0;
// points(3번의 기회 점수 배열)
int[] points = new int[3];
// index(저장 위치 인덱스)
int index = -1;
for (int i = 0; i < dartResult.length(); i++) {
// now(dartResult의 i 값)
char now = dartResult.charAt(i);
// now가 숫자라면
if (Character.isDigit(now)) {
// now가 0이라면 (0, 10)
if (now == '0') {
// index가 -1이 아니고 points[index]가 1이라면
if (index != -1 && points[index] == 1)
// 10 저장
points[index] = 10;
// index가 -1 이거나 points[index]가 1이 아니라면
else
// 0 저장
points[++index] = 0;
}
// now가 0이 아니라면 (1 ~ 9)
else {
// now 저장
points[++index] = Character.getNumericValue(now);
}
}
// now가 S, D, T라면
else if (now == 'S' || now == 'D' || now == 'T') {
// S라면
if (now == 'S') {
// 1제곱이므로 통과
continue;
}
// D라면
else if (now == 'D') {
// 2의 제곱 저장
points[index] = (int) Math.pow(points[index], 2);
}
// T라면
else {
// 3의 제곱 저장
points[index] = (int) Math.pow(points[index], 3);
}
}
// now가 *, #라면
else {
// *라면
if (now == '*') {
// 2배 저장
points[index] = points[index] * 2;
// 첫 번째 점수가 아니라면
if (index != 0)
// 바로 앞의 점수도 2배 저장
points[index - 1] = points[index - 1] * 2;
}
// #라면
else {
// -1배 저장
points[index] = points[index] * -1;
}
}
}
// answer에 점수 합계 저장
for (int i = 0; i < points.length; i++) {
answer += points[i];
}
// answer 반환
return answer;
}
// 테스트 케이스
public static void main(String[] args) {
L035_17682 solution = new L035_17682();
String dartResult = "0D2S0T";
int result = solution.solution(dartResult);
System.out.println(result);
}
}
'Coding Test > Java 알고리즘 실전' 카테고리의 다른 글
[64061] 크레인 인형뽑기 게임 (0) | 2023.12.30 |
---|---|
[42889] 실패율 (0) | 2023.12.30 |
[17681] 비밀지도 (0) | 2023.12.29 |
[12982] 예산 (0) | 2023.12.29 |
[12977] 소수 만들기 (0) | 2023.12.29 |