본문 바로가기
JAVA/Coding Test Study

[Lv.0] 프로그래머스 - 주사위 게임 3 : Java

by ♡˖GYURI˖♡ 2024. 4. 19.
728x90
 

프로그래머스

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

programmers.co.kr

 

 

 

이해하기

처음 접근은 Map으로 시도했었다.

  • Map에 key = 숫자, value = 개수로 잡고 전부 저장한다.
  • Map 사이즈가 1이면 전부 같다는 뜻
  • Map 사이즈가 2이면 다음과 같다
    • 세 개가 같고 하나가 다름
    • 두 개가 같고, 나머지 두 개가 같음
  • Map 사이즈가 3이면 두 개가 같고, 나머지 두 개가 다름
  • Map 사이즈가 4면 전부 다름

이런 식으로 구현하고 싶었는데, Map 사이즈가 2일 때 3:1인지, 2:2인지 구분하는 부분에서 아마 실패한 것 같다.

 

참고한 블로그⬇️

 

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

내 코드는,, 하드코딩이라,,if로 다 갈겼다다른 사람풀이로 코드 리뷰 진행..다른 사람의 풀이Arrays.sort 로 진행한 것,,,머리 정말 좋으시다이건 HashMap인데.. 내가 아직 이해도가 떨어진다

velog.io

 

 

문제풀이

import java.util.*;

class Solution {
    public int solution(int a, int b, int c, int d) {
        int answer = 0;
        
        int[] dice = {a, b, c, d};
        Arrays.sort(dice);
        
        if (dice[0] == dice[3]) {
            answer = 1111 * dice[3];
        } else if (dice[0] == dice[2] || dice[1] == dice[3]) {
            answer = (int) Math.pow(dice[1] * 10 + (dice[0] + dice[3] - dice[1]), 2);
            
            System.out.println(dice[1] + " " + dice[0] + " " + dice[3] + " ");
        } else if (dice[0] == dice[1] && dice[2] == dice[3]) {
            answer = (dice[0] + dice[2]) * Math.abs(dice[0] - dice[2]);
        } else if (dice[0] == dice[1]) {
            answer = dice[2] * dice[3];
        } else if (dice[1] == dice[2]) {
            answer = dice[0] * dice[3];
        } else if (dice[2] == dice[3]) {
            answer = dice[0] * dice[1];
        } else {
            answer = dice[0];
        }
        
        return answer;
    }
}

 

        int[] dice = {a, b, c, d};
        Arrays.sort(dice);

 

sort를 생각해낸게 진짜 똑똑하다고 생각했다...

 

        if (dice[0] == dice[3]) {
            answer = 1111 * dice[3];

 

sort했는데 처음과 끝이 같다면 그 사이 값들도 전부 같은 것이니 4개가 다 같은 것으로 본다!

 

        } else if (dice[0] == dice[2] || dice[1] == dice[3]) {
            answer = (int) Math.pow(dice[1] * 10 + (dice[0] + dice[3] - dice[1]), 2);

 

이 부분이 좀 어려웠는데 예를 들어서 생각해보니 이해됐다.

dice = {1, 4, 4, 4}일 경우를 생각해보자. (이미 sort된 것)

이 경우 dice[0]만 다르고 , dice[1]부터 dice[3]까지 같으니 1개/3개 조합이다.

 

dice = {1, 1, 1, 4}일 경우도 함께 보아야 한다.

이 경우 dice[0]부터 dice[2]까지 같고, dice[3]만 다르다.

 

이 때, 두 경우 모두에서 3개쪽에 포함되는 인덱스를 찾아야 한다.

첫번째 경우 3개쪽에 포함되는 인덱스들은 1, 2, 3

두번째 경우 3개쪽에 포함되는 인덱스들은 0, 1, 2

1 또는 2가 겹치는 인덱스이다.

위 코드에서는 1을 겹치는 인덱스로 사용하였다.

 

그래서 다시 식을 살펴보면 세 개 나온 숫자가 p, 하나 나온 숫자가 q일 때, answer = (10 * p + q)^2이다.

p를 dice[1]로 잡고, q를 찾아야하는데 이 q가 또 문제다.

첫번째 경우에는 dice[0]이 q이고, 두번째 경우에는 dice[3]이 q이다.

 

위 식에서는 q를 dice[0] + dice[3] - dice[1]로 잡았는데 이 또한 예시들을 가지고 생각해보자.

dice = {1, 4, 4, 4}일 경우 q = 1 + 4 - 4 = 1이 된다.

dice = {1, 1, 1, 4}일 경우 q = 1 + 4 - 1 = 4가 된다.

 

p값 또는 q값이 될 수 있는 경우인 dice[0]과 dice[3]을 더해놓고, (p + q)

3개쪽 수인 p값을 빼주면 q만 남게 되는 것이다. (p + q - p) = q

 

        } else if (dice[0] == dice[1] && dice[2] == dice[3]) {
            answer = (dice[0] + dice[2]) * Math.abs(dice[0] - dice[2]);

 

이건 두 개, 두 개씩 같은 경우

 

        } else if (dice[0] == dice[1]) {
            answer = dice[2] * dice[3];
        } else if (dice[1] == dice[2]) {
            answer = dice[0] * dice[3];
        } else if (dice[2] == dice[3]) {
            answer = dice[0] * dice[1];

 

두 개만 같고, 나머지는 각각 다를 경우

 

        } else {
            answer = dice[0];
        }

 

전부 다를 경우