알고리즘

[프로그래머스 - 2018카카오] [1차]다트게임

제이G 2023. 4. 15. 12:22

리뷰

  1. 소요시간: 1시간 10분
  2. 오래걸린 이유: 문자열 점수|보너스|[옵션]에 대한 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