[프로그래머스] Level 0 주사위게임3

 

너무 어려웠다.

오랜 시간 머리를 쥐어짰지만 아직은 역부족인가보다.

결국 노가다에 가까운 코드를 만들어

억지로 정답을 맞췄다...

 

 

 

문제

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 하는 메서드를 작성하라

 

 

 

 

 

나의 답안

 

공개하기 부끄럽다...

import java.util.*;

class Solution {
    public int solution(int a, int b, int c, int d) {
        
        int ab = a==b ? 1 : 0;
        int ac = a==c ? 1 : 0;
        int ad = a==d ? 1 : 0;
        int bc = b==c ? 1 : 0;
        int bd = b==d ? 1 : 0;
        int cd = c==d ? 1 : 0;
        String result = ""+ab+ac+ad+bc+bd+cd;
        
        switch (result) {
            case "111111":
                return 1111 * a;
            case "110100":
                return (10 * a + d) * (10 * a + d);
            case "101010":
                return (10 * a + c) * (10 * a + c);
            case "011001":
                return (10 * a + b) * (10 * a + b);
            case "000111":
                return (10 * b + a) * (10 * b + a);
            case "100001":
                return (a + c) * (a - c) > 0 ? (a + c) * (a - c) : (a + c) * (a - c) * -1;
            case "010010":
                return (a + b) * (a - b) > 0 ? (a + b) * (a - b) : (a + b) * (a - b) * -1;
            case "001100":
                return (a + b) * (a - b) > 0 ? (a + b) * (a - b) : (a + b) * (a - b) * -1;
            case "100000":
                return c * d;
            case "010000":
                return b * d;
            case "001000":
                return b * c;
            case "000100":
                return a * d;
            case "000010":
                return a * c;
            case "000001":
                return a * b;
            default:
                ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(a, b, c, d));
                return Collections.min(numbers);
        }
    }
}
        

 

 

 

다른 유저의 답안

import java.util.Arrays;

class Solution {
    public int solution(int a, int b, int c, int d) {

        int[] dice = { a, b, c, d };
        Arrays.sort(dice);             //배열로 저장 후 오름차순정렬

        int ans = 0;

        if (dice[0] == dice[3]) { 
            ans = 1111 * dice[3];         //4개 모두 같을 때
        } else if (dice[0] == dice[2] || dice[1] == dice[3]) { 
            ans = (int) Math.pow(dice[1] * 10 + (dice[0] + dice[3] - dice[1]), 2);     // 3개만 같을 때
        } else if (dice[0] == dice[1] && dice[2] == dice[3]) {     
            ans = (dice[0] + dice[3]) * (dice[3] - dice[0]);       // 2개씩 같을 때
        } else if (dice[0] == dice[1]) {         
            ans = dice[2] * dice[3];
        } else if (dice[1] == dice[2]) {
            ans = dice[0] * dice[3];
        } else if (dice[2] == dice[3]) {
            ans = dice[0] * dice[1];                // 2개만 같을 때
        } else {
            ans = dice[0];            // 모두 다를 때
        }

        return ans;
    }
}
  • 정렬을 이용하여 케이스를 나누기 용이하게 함
  • 가장 작은 수를 추출하기에도 용이함

 

복습

  • 배열 오름차순 정렬 :  Arrays.sort(배열)
  • 배열 선언과 동시에 값 입력 : int[] arr = {1, 2, 3, 4, 5};