본문 바로가기
코딩테스트/자바 Level 0

[Java] 주사위 게임 3

by onggury 2023. 7. 27.

문제

1부터 6까지 숫자가 적힌 주사위가 네 개 있습니다. 네 주사위를 굴렸을 때 나온 숫자에 따라 다음과 같은 점수를 얻습니다.

  • 네 주사위에서 나온 숫자가 모두 p로 같다면 1111 × p 점을 얻습니다.
  • 세 주사위에서 나온 숫자가 p로 같고 나머지 다른 주사위에서 나온 숫자가 q(p ≠ q) 라면 (10 × p + q)^2 점을 얻습니다.
  • 주사위가 두 개씩 같은 값이 나오고, 나온 숫자를 각각 p, q(p ≠ q) 라고 한다면 (p + q) × |p - q| 점을 얻습니다.
  • 어느 두 주사위에서 나온 숫자가 p로 같고 나머지 두 주사위에서 나온 숫자가 각각 p와 다른 q, r(q ≠ r) 이라면 q × r 점을 얻습니다.
  • 네 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자 만큼의 점수를 얻습니다.

네 주사위를 굴렸을 때 나온 숫자가 정수 매개변수 a, b, c, d로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.

 

 

제한사항

  • a, b, c, d 는 1 이상 6 이하의 정수입니다.

 

import java.util.HashMap;
import java.util.ArrayList;

class Solution {
    public int solution(int a, int b, int c, int d) {
        int answer = 7;
        HashMap<Integer, Integer> diceResult = new HashMap<Integer, Integer>();
        
        diceResult.put(a, diceResult.getOrDefault(a, 0) + 1);
        diceResult.put(b, diceResult.getOrDefault(b, 0) + 1);
        diceResult.put(c, diceResult.getOrDefault(c, 0) + 1);
        diceResult.put(d, diceResult.getOrDefault(d, 0) + 1);
        
        // System.out.println(diceResult);
        ArrayList<Integer> diceResultKey = new ArrayList<Integer>();
        for(Integer dice : diceResult.keySet()) {
            diceResultKey.add(dice);
        }
        
        int diceResultKeyLen = diceResultKey.size();
        if(diceResultKeyLen == 1) {
            answer = 1111 * diceResultKey.get(0);
        }
        else if(diceResultKeyLen == 2) {
            int dice1 = diceResultKey.get(0);
            int dice2 = diceResultKey.get(1);
            
            if((diceResult.get(dice1) == 1 && diceResult.get(dice2) == 3)) {
                //(10 × p + q)^2
                answer = (int)Math.pow((10 * dice2 + dice1), 2);
            }
            else if((diceResult.get(dice1) == 3 && diceResult.get(dice2) == 1)) {
                answer = (int)Math.pow((10 * dice1 + dice2), 2);
            }
            else if(diceResult.get(dice1) == diceResult.get(dice2)) {
                answer = (dice1 + dice2) * Math.abs(dice1 - dice2);
            }
        }
        else if(diceResultKeyLen == 3) {
            int dice1 = diceResultKey.get(0);
            int dice2 = diceResultKey.get(1);
            int dice3 = diceResultKey.get(2);
            
            if(diceResult.get(dice1) == 2) {
                answer = dice2 * dice3;
            }
            else if(diceResult.get(dice2) == 2) {
                answer = dice1 * dice3;
            }
            else if(diceResult.get(dice3) == 2) {
                answer = dice1 * dice2;
            }
        }
        else if(diceResultKeyLen == 4) {
            for(int i = 0; i < diceResultKeyLen; i++) {
                answer = Math.min(answer, diceResultKey.get(i));
            }
        }
        
        return answer;
    }
}

괜히 길기만 길고 사실 시물레이션 문제답게 문제에 주어진 조건을 그저 조건문으로 나열했을 뿐이다.

 

처음엔 a, b, c, d 중 중복된 값을 추려내야 하므로 hashMap을 쓰기로 하였다.

getOrDefault() 메서드를 통해 중복된 key는 value 값을 1 증가시켜서 중복이 몇 번 되는지 판단하였다.

만들어진 hashMap 의 길이를 통해 중복이 어떻게 나왔는지 대략적으로 파악한다.

길이가 4라면, 이는 a, b, c, d 모두 다른 값이라는 뜻이다.

길이가 3이라면, a, b, c, d 중 두 개의 값이 같고 두 개의 값이 다른 경우다

길이가 2인 경우에는 좀 갈리는데, 첫번째 경우는, 네 개의 숫자가 2개씩 같은 값이 나온 경우이다. 그리고 두 번째 경우는 3개의 값이 같고 나머지 한 개가 다른 경우이다.

예를 들어서 4와 5 두 개의 쌍이 나왔다고 치면,

4가 두 개, 5가 두 개

4가 한 개, 5가 세 개

4가 세 개, 5가 한 개

이렇게 세 가지 경우가 나온다.

마지막으로 길이가 1인 경우는 모두 같은 값이라는 뜻이다.

 

이 조건을 사용해서 해결하였다.

 

 

출처

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