String에서 원하는 정보를 Parsing하는 문제이다. 입력 형식이 점수,보너스,옵션(선택)인 문자열이 붙어서 나열되어있다.
이때 고려해야 하는 점은 점수가 0~9까지는 1자리 이지만 10까지 고려해야한다는 점(1이나왔지만 바로 다음 문자가 보너스가 아닐 수도 있음) 그리고 옵션이 항상 있는 것은 아니라는 점이다.
이 문제를 해결하기 위해 점수 1세트를 클래스로 정의하고 먼저 Parsing을 시도하였다.
class Score {
int score;
char bonus;
char opt;
Score(){
score = 0;
bonus = 'S';
opt = 'N';
}
}
문자열에서 점수를 얻어오는 함수이다.
public int getScore(int start, String str) {
int score=0;
if(str.charAt(start) == '1') {
if(start+1 < str.length()) {
if(str.charAt(start+1) == '0') { // 10
score = 10;
}
else {
score = 1;
}
}
else {
score = 1;
}
}
else {
score = str.charAt(start) - '0';
}
return score;
}
이후 보너스와 옵션도 Parsing 해주었다.
while(top < dartResult.length()) {
score = new Score();
score.score = getScore(top,dartResult);
if(score.score == 10) {
top += 2;
}
else {
top++;
}
score.bonus = dartResult.charAt(top);
top++;
/* 옵션이 있다면 */
if(top < dartResult.length()) {
if(dartResult.charAt(top)-'0'<0 || dartResult.charAt(top)-'0'>9) {
score.opt = dartResult.charAt(top);
top++;
}
}
scoreList.add(score);
}
마지막으로 점수 계산을 위해서 점수만 들어있는 배열을 만들고 각 보너스와 옵션에 맞게 계산해주었다. (배열 추가 생성 없이 기존에 Score ArrayList로 하는 것이 메모리 측면에서 더 좋을지 모르겠지만 읽기 쉬운 코드를 위해 하나 생성)
아래는 코드 전문이다.
import java.util.*;
class Solution {
public int solution(String dartResult) {
int answer = 0;
int top = 0;
ArrayList<Score> scoreList = new ArrayList<>();
Score score;
while(top < dartResult.length()) {
score = new Score();
score.score = getScore(top,dartResult);
if(score.score == 10) {
top += 2;
}
else {
top++;
}
score.bonus = dartResult.charAt(top);
top++;
/* 옵션이 있다면 */
if(top < dartResult.length()) {
if(dartResult.charAt(top)-'0'<0 || dartResult.charAt(top)-'0'>9) {
score.opt = dartResult.charAt(top);
top++;
}
}
scoreList.add(score);
}
int[] scoreArr = new int[scoreList.size()];
for(int i = 0; i < scoreArr.length; i++) {
// bonus
if(scoreList.get(i).bonus == 'S') {
scoreArr[i] = scoreList.get(i).score;
}
else if(scoreList.get(i).bonus == 'D') {
scoreArr[i] = scoreList.get(i).score * scoreList.get(i).score;
}
else {
scoreArr[i] = scoreList.get(i).score * scoreList.get(i).score * scoreList.get(i).score;
}
//option
if(scoreList.get(i).opt == '*') {
scoreArr[i] *= 2;
if(i != 0) {
scoreArr[i-1] *= 2;
}
}
else if(scoreList.get(i).opt == '#') {
scoreArr[i] *= -1;
}
else {
continue;
}
}
for(int i = 0; i < scoreArr.length; i++) {
answer += scoreArr[i];
}
return answer;
}
public int getScore(int start, String str) {
int score=0;
if(str.charAt(start) == '1') {
if(start+1 < str.length()) {
if(str.charAt(start+1) == '0') { // 10
score = 10;
}
else {
score = 1;
}
}
else {
score = 1;
}
}
else {
score = str.charAt(start) - '0';
}
return score;
}
}
class Score {
int score;
char bonus;
char opt;
Score(){
score = 0;
bonus = 'S';
opt = 'N';
}
}
댓글