리뷰
- 소요시간: 1시간 10분
- 오래걸린 이유: 문자열 점수|보너스|[옵션]에 대한 parsing작업이 오래걸림.
for문으로 직접 구현하는 방법은 번거로울 것 같고, 정규식을 이용하면 될 것 같은데 잘 떠오르지 않았음.
문제풀이
제한
- 점수|보너스|[옵션]으로 이루어진 문자열 3세트
- 점수 N: 0~10 → O(N!)
- 보너스: S, D, T중 하나
- 옵션: *, #중 하나, 없을 수도 있다.
유형
Goal: 문자열에 대한 총점수 구하기 → 구현문제
설계
1. 문자열 3세트의 다트게임 문자열로 Parsing하기
- 점수 Parsing: 정규식 이용
- 보너스 Parsing: 정규식 이용
- 옵션 Parsing: 정규식 이용
2. 라운드별 다트게임 점수 계산하기
- 보너스 적용하기
- 옵션 적용하기
코드
import java.io.*;
import java.util.*;
class Solution {
public int solution(String dartResult) {
int answer = 0;
int[] scores = new int[3];
String[] bonuses = new String[3];
String[] options = new String[3];
int totalScore = pro(dartResult, scores, bonuses, options);
return totalScore;
}
private int pro(String dartResult, int[] scores, String[] bonuses, String[] options) {
// 1. parsing
parsing(dartResult, scores, bonuses, options);
// 2. 라운드별 dart 점수 계산
int[] dartScores = new int[3];
for(int round=0; round<3; round++) {
calculateScore(dartScores, round, scores[round], bonuses[round], options[round]);
}
int totalScore = 0;
for(int score: dartScores) {
totalScore += score;
}
return totalScore;
}
private void parsing(String dartResult, int[] scores, String[] bonuses, String[] options) {
// 숫자 parsing
String[] parsingInfo = dartResult.split("[A-Z, *, #]");
for(int idx=0, dartRound=0; idx<parsingInfo.length; idx++) {
if(parsingInfo[idx].equals("")) {
continue;
}
scores[dartRound++] = Integer.parseInt(parsingInfo[idx]);
}
// bonus parsing
parsingInfo = dartResult.split("[0-9, *, #]");
for(int idx=0, dartRound=0; idx<parsingInfo.length; idx++) {
if(parsingInfo[idx].equals("")) {
continue;
}
bonuses[dartRound++] = parsingInfo[idx];
}
// option parsing
parsingInfo = dartResult.split("[0-9]");
for(int idx=0, dartRound=0; idx<parsingInfo.length; idx++) {
if(parsingInfo[idx].equals("")) {
continue;
}
if(parsingInfo[idx].contains("*")) {
options[dartRound++] = "*";
continue;
}
if(parsingInfo[idx].contains("#")) {
options[dartRound++] = "#";
continue;
}
options[dartRound++] = "NoOption";
}
}
private void calculateScore(int[] dartScores, int round, int score, String bonus, String option) {
// 1. 보너스 적용하기
score = calculateBonus(score, bonus);
// 2. 옵션 적용하기
score = calculateOption(dartScores, round, score, option);
dartScores[round] = score;
}
private int calculateBonus(int score, String bonus) {
if(bonus.equals("S")) {
return (int) Math.pow(score, 1);
}
if(bonus.equals("D")) {
return (int) Math.pow(score, 2);
}
return (int) Math.pow(score, 3);
}
private int calculateOption(int[] dartScores, int round, int score, String option) {
if(option.equals("*")) {
score *= 2;
if(round!=0) {
dartScores[round-1] *= 2;
}
} else if(option.equals("#")) {
score *= -1;
}
return score;
}
}
'알고리즘' 카테고리의 다른 글
[백준 15683] 감시 - 재귀, dfs, 순열 (0) | 2023.04.26 |
---|---|
[LeetCode] 3Sum - 이분탐색, 투포인터 (0) | 2023.04.14 |
[BOJ] 12873 기념품 - java (0) | 2023.04.03 |
DFS로 조합구하기 (0) | 2022.12.30 |
조합론 이론과 구현 (0) | 2022.07.24 |