본문 바로가기
알고리즘/PROGRAMMERS

다트 게임(Lv.1)

by 현대타운301 2024. 3. 22.

 


 

문제 설명

 

 

 

입출력 예시

 

 

요약

획득 가능 점수는 0~10점

S = single, D = double, T = triple

* = 해당 턴 및 앞 턴의 점수 x2 (첫 번째 턴이라면 해당 점수만 적용)

# = 해당 턴 점수 x(-1)

 


 

풀이

 

문제 해석

숫자|알파벳|특수기호 조합의 각 턴의 점수를 계산한다.

 

 

접근 방식

1. 점수 리스트 생성

  → 알파벳 전의 1자리 혹은 2자리가 숫자면 intList.add()

 

2. 알파벳 리스트 생성

  → charAt(i).isAlphabetic()이면 strList.add()

 

3. 특수기호 리스트 생성

  → 알파벳 뒤의 1자리가 특수기호(*, #)면 symbolList.add()

 


 

코드리뷰

 

import java.util.*;

class Solution {
    public int solution(String dartResult) {
        List<Integer> intList = new ArrayList<>();
        List<String> strList = new ArrayList<>();
        List<String> symbolList = new ArrayList<>();
        // 1. 점수, 보너스, 옵션 List 만들기
        for(int i = 0; i < dartResult.length(); i++) {
            if(Character.isAlphabetic(dartResult.charAt(i))) {
                strList.add(String.valueOf(dartResult.charAt(i)));	// 보너스 리스트
                if(i < dartResult.length()-1 && (dartResult.charAt(i+1) == '#' || dartResult.charAt(i+1) == '*')) {
                    symbolList.add(String.valueOf(dartResult.charAt(i+1)));	// 옵션 리스트
                } else {
                    symbolList.add(" ");	// 옵션이 아무것도 없으면 공백
                }
                if(i >= 2 && Character.isDigit(dartResult.charAt(i-2))) {
                    intList.add(Integer.valueOf(dartResult.substring(i-2, i)));	// 점수 리스트(10점)
                } else {
                    intList.add(Integer.valueOf(dartResult.substring(i-1, i)));	// 점수 리스트(0-9점)
                }
            }
        }
        // 2. 보너스를 반영한 점수 리스트
        for(int i = 0; i < intList.size(); i++) {
            if(strList.get(i).equals("D")) {	// socre *= score
                int num = intList.get(i) * intList.get(i);
                intList.set(i, num);
            } else if(strList.get(i).equals("T")) {	// socre *= score * score
                int num = intList.get(i) * intList.get(i) * intList.get(i);
                intList.set(i, num);
            }
        }
        // 3. 옵션을 반영한 점수 리스트
        for(int i = 0; i < intList.size(); i++) {
            if(i == 0 && symbolList.get(i).equals("*")) {	// 첫 번째 옵션이 *일 경우
                intList.set(i, intList.get(i) * 2);	// 현재 점수 x2
            } else {
                if(symbolList.get(i).equals("*")) {
                    intList.set(i-1, intList.get(i-1) * 2);	// 이전 점수와 현재 점수 x2
                    intList.set(i, intList.get(i) * 2);
                } else if(symbolList.get(i).equals("#")) {
                    intList.set(i, intList.get(i) * -1);	// 현재 점수 x(-1)
                }
            }
        }
        // 정답 제출
        int answer = 0;
        for(int i = 0; i < intList.size(); i++) {
            answer += intList.get(i);
        }
        return answer;
    }
}

 

 

 

'알고리즘 > PROGRAMMERS' 카테고리의 다른 글

타겟 넘버(Lv.2)  (0) 2024.03.22
실패율(Lv.1)  (0) 2024.03.22
체육복(Lv.1)  (0) 2024.03.21
완주하지 못한 선수(Lv.1)  (0) 2024.03.21
소수 찾기(Lv.2)  (0) 2024.03.21