본문 바로가기

알고리즘/Lv. 1

프로그래머스 17682 다트 게임 자바 풀이

728x90

난이도 : Lv. 1

풀이일 : 2412172

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


문제


풀이 코드

import java.util.HashMap;
import java.lang.Math;

class Solution {
    public int solution(String dartResult) {
        int answer = 0;
        int index = 0; // 현재 숫자 인덱스
        int[] result = new int[3]; // 각 숫자 처리 결과 저장
        String[] nums = dartResult.replace("10", "X").split(""); // 10 변환
        HashMap<String, Integer> bonus = new HashMap<String, Integer>();
        bonus.put("S", 1); // 보너스 정보 입력
        bonus.put("D", 2);
        bonus.put("T", 3);
        
        for (int i = 0; i < nums.length; i++) {
            if (bonus.get(nums[i]) != null) {
                result[index - 1] = (int) Math.pow(result[index - 1], bonus.get(nums[i]));
            }
            else if (nums[i].equals("*")) {
                result[index - 1] *= 2;
                if (index > 1) {
                    result[index - 2] *= 2;
                }
            }
            else if (nums[i].equals("#")) {
                result[index - 1] *= -1;
            }
            else { // 숫자 저장
                result[index] = nums[i].equals("X") ? 10 : Integer.parseInt(nums[i]);
                index++;
            }
        }
        
        for (int i = 0; i < 3; i++) { // 처리된 값 더하기
            answer += result[i];
        }
        
        return answer;
    }
}
  • 파이썬 로직과 마찬가지로 숫자들이 주어지면 배열에 넣고, 추가 연산이 주어질때마다 해당 숫자를 변경한다.
  • 현재 어떤 숫자를 계산해야 하는지는 index로 관리한다.
  • 모든 숫자들을 처리한 이후, 처리된 값을 모두 더해 반환한다.

실행 결과


수정 코드

import java.util.HashMap;
import java.lang.Math;

class Solution {
    public int solution(String dartResult) {
        int answer = 0;
        int index = 0;
        int[] result = new int[3];
        String[] nums = dartResult.replace("10", "X").split("");
        HashMap<String, Integer> bonus = new HashMap<String, Integer>(){{
            put("S", 1);
            put("D", 2);
            put("T", 3);
        }};
        
        for (int i = 0; i < nums.length; i++) {
            if (bonus.get(nums[i]) != null) {
                result[index - 1] = (int) Math.pow(result[index - 1], bonus.get(nums[i]));
            }
            else if (nums[i].equals("*")) {
                result[index - 1] *= 2;
                if (index > 1) {
                    result[index - 2] *= 2;
                }
            }
            else if (nums[i].equals("#")) {
                result[index - 1] *= -1;
            }
            else {
                result[index] = nums[i].equals("X") ? 10 : Integer.parseInt(nums[i]);
                index++;
            }
        }
        
        for (int i = 0; i < 3; i++) {
            answer += result[i];
        }
        
        return answer;
    }
}
  • HashMap에 처음부터 S, D, T에 대한 정보를 넣고 싶은데 할 줄 몰라서 찾아보고 수정했다. 유의미한 변화는 없는데 이후에 뭘 더 넣을 게 아니라서 파이썬 풀이처럼 한 번에 넣어두고 싶었다.