Algorithm/코테 연습

[프로그래머스 코테 연습]자바 - 1차 다트 게임

나맘임 2024. 7. 8. 01:28

개요

코딩테스트 연습 - [1차] 다트 게임 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

난이도 : 레벨 1

특징 : 2018 KAKAO BLIND RECRUITMENT 기출 문제

 

풀이법

package programmers;

import java.util.HashMap;

public class 프머스_1차_다트게임 {
    public static void main(String[] args) {
        System.out.println(solution("1S2D*3T"));

    }

    public static int solution(String dartResult) {
        int answer = 0;
        int currentDartNumber = 0;
        int len = dartResult.length();
        HashMap<Integer, Integer> results = new HashMap<>();

        for (int i = 0; i < len; i++) {
            char currentChar = dartResult.charAt(i);

            if (Character.isDigit(currentChar)) {
                currentDartNumber++;
                int num = currentChar - '0';

                if (i + 1 < len && dartResult.charAt(i + 1) == '0') {
                    num = 10;
                    i++;
                }
                results.put(currentDartNumber, num);
            } else {
                switch (currentChar) {
                    case 'S':
                        results.put(currentDartNumber, (int) Math.pow(results.get(currentDartNumber), 1));
                        break;
                    case 'D':
                        results.put(currentDartNumber, (int) Math.pow(results.get(currentDartNumber), 2));
                        break;
                    case 'T':
                        results.put(currentDartNumber, (int) Math.pow(results.get(currentDartNumber), 3));
                        break;
                    case '*':
                        if (currentDartNumber > 1) {
                            results.put(currentDartNumber - 1, results.get(currentDartNumber - 1) * 2);
                        }
                        results.put(currentDartNumber, results.get(currentDartNumber) * 2);
                        break;
                    case '#':
                        results.put(currentDartNumber, results.get(currentDartNumber) * -1);
                        break;
                }
            }
        }

        for (int i = 1; i <= 3; i++) {
            answer += results.get(i);
        }

        return answer;
    }
}

중점포인트

1. HashMap을 사용하여 다트 1번부터 다트 3번까지의 결과를 저장

    Key : 다트 번호

    Value : 점수

 

2. 입력의 맨 처음엔 숫자가 오므로 숫자가 오는 걸 기준으로 다트 번호를 구분한다.

 

3. dartResult String의 각 문자(char) 하나씩 검사하면서 나아간다.

 

과정

1. darResult의 char 하나씩 탐색하기 위해 반복문을 이용한다.

 

2. 현재 가리키는 char를 currentChar에 저장한다.

 

3. currentChar가 숫자라면 currentDartNumber를 올리고 10일 경우엔 i++ 를 함으로써 0을 스킵할 수 있게 해준다. 또한 마지막엔 hashMap에 currentDartNumber와 점수를 초기화해준다.

 

3-2. 만약 currentChar가 숫자가 아니라면 보너스 혹은 옵션이므로 swith 문을 통해 구분해서 처리해준다. 이때, 스타상(*)은 currentDartNumber가 1이면 자기 자신만 처리해야하므로 조건문을 통해 따로 계산한다.

 

4. 2로 돌아간다. dartResult String을 모두 탐색할 때까지