Algorithm & Data Structure/문제 풀이

[JAVA] 프로그래머스 - 다트 게임 LV1

뭉지(moonz) 2022. 4. 1. 15:09
반응형

문제는 아래 링크를 통해 확인해주세요.

https://programmers.co.kr/learn/courses/30/lessons/17682

 

코딩테스트 연습 - [1차] 다트 게임

 

programmers.co.kr

 

조건 및 설계

  • 점수 : 0~10
  • 보너스 : S(1), D(2), T(3)
  • 옵션 : 옵션은 존재하지 않을 수도 있다.
    • * : 위치 기준 i와 i-1를 2배 한다. (만약 i=0이라면 i만 2배한다.)
      • *와 * 중첩 : 위와 마찬가지로 진행하면 된다. (결국 i-1의 score는 4배가 된 셈이다.)
      • #와 * 중첩 : i-1에 대해서 -1배가 적용된 값에 그대로 2배를 적용한다. (-2배)
    • # : 위치 기준 i에 -1배 한다.(즉 마이너스)

내 생각

  • 길이 3인 int형 배열 score에 값을 넣어주는데..
  • input으로 들어오는 dartResult에서 점수 - 보너스 - 옵션 순으로 하나씩 검사하면서 값에 변환을 주면 된다.
  • 결국 score 배열 만큼 도는 반복문 내에서 dartResult는 index를 이용해서 하나씩 증가시켜주며 방문한다.
  • 숫자 : 10이 나오는 경우를 따로 처리해줘야 한다.
    • dartResult의 다음 인덱스가 0이면 score[i]에 10을 넣어준다.
    • 10인 경우, dartResult의 index를 ++해줘야한다. 
  • 보너스 : D, T인 경우 score[i] 값을 꺼내서 제곱, 세제곱해준다.
  • 옵션 : 나오지 않을 수 있는 경우이기 때문에, 옵션인지 숫자인지 체크하고 옵션이면 로직을 진행한다.
    • *이면, (i가 0보다 큰경우에만 이전 index와) 현재 index를 2배 한다.
      • 이전 다트 score에서 옵션이 #이거나 *이어서 중첩인 경우를 문제에는 말해놨는데 해당 풀이 방식에서는 따로 고려할 것은 없다.
    • #이면, -1을 곱한다.
  • 마지막에 score 배열들을 모두 합한다.

추가로, 이번 문제는 모든 입출력 예제를 읽으며 이해해본 후에 문제를 푸는게 더 빨리 풀 수 있을 것 같다. (본인은 그러지 않아서 그때그때 조건을 고려하면서 시간이 추가로 걸렸다)

입출력 예제

코드

피드백을 받지 않은 코드이기 때문에 완벽한 코드는 아닐 수 있습니다.

public class prg_다트게임 {
    public int solution(String dartResult) {
        int ans = 0;
        int[] score = new int[3];   // 점수 매길 배열
        int dartIdx = 0;
        // 1. dartResult 하나씩 방문하면서 점수[]에 변환을 준다.
        for (int i=0; i< score.length; i++) {
            // 2. 숫자
            int digit = Integer.parseInt(String.valueOf(dartResult.charAt(dartIdx)));
            if (digit == 1 && dartResult.charAt(dartIdx+1) == '0') {
                score[i] = 10;
                dartIdx++;
            }
            else score[i] = digit; // 0~9
            // 3. 보너스
            char bonus = dartResult.charAt(++dartIdx);
            if (bonus == 'D') score[i] = pow(score[i], 2);
            else if (bonus == 'T') score[i] = pow(score[i], 3);

            if (dartIdx >= dartResult.length()-1) break;    // 끝난 경우 종료.
            // 4. 옵션
            char optionOrScore = dartResult.charAt(++dartIdx);
            if (!Character.isDigit(optionOrScore)) {    // 옵션일 경우
                if (optionOrScore == '*') {
                    score[i] *= 2;
                    if (i>0) score[i-1] *= 2;
                } else { // '#'
                    score[i] *= (-1);
                }
                dartIdx++;  // index 이동(숫자로)
            }
        }
        // 5. 합
        for (int n: score) ans+= n;
        return ans;
    }
    private int pow(int i, int n) {
        return (int)Math.pow(i, n);
    }

    public static void main(String[] args) {
        prg_다트게임 t = new prg_다트게임();
        int solution = t.solution("1S*2T*3S");
        System.out.println(solution);
    }
}

 

 

피드백과 댓글은 환영입니다.
반응형