코테

[프로그래머스] 주사위 게임 3 - List로 풀이 방법

오은이 2025. 7. 1. 17:03

 

 

 

 

4개의 주사위를 굴렸을 때 발생할 수 있는 경우를 나누는 문제이다.

 

아래 5가지 상황을 고려해야 한다.

 

  1. 4개 모두 같은 값일 경우
  2. 3개가 같은 값일 경우
  3. 2개 2개씩 같은 값일 경우
  4. 2개만 같은 값일 경우
  5. 모두 다른 값일 경우

 

 

 

 

어떻게 할까 고민하다가 찾은 List 풀이방법..

 

 

내가 작성한 코드

import java.util.*;
    
    public static int solution(int a, int b, int c, int d) {
		
    	List<Integer> list = new ArrayList<>();
        int answer = 0;
        int firstVal = 0;	// 첫 번째 중복 값
        int secondVal = 0;	// 두 번째 중복 값
        int[] arr = new int [4];
        
        arr[0] = a;
        arr[1] = b;
        arr[2] = c;
        arr[3] = d;

        for (int i = 0; i < arr.length; i++) {
			if (list.contains(arr[i])) {
				if (firstVal == 0) {
					firstVal = arr[i];
				}
				else {
					secondVal = arr[i];
				}
			}
			else {
				list.add(arr[i]);
			}
		}
        
        if (list.size() == 1) {	// 모두 같음
        	answer = list.get(0) * 1111;
        }
        else if (list.size() == 2) {	// aaab or aabb
        	if (firstVal == secondVal) {		// 3개 같음(aaab)
        		list.remove(Integer.valueOf(firstVal));
        		answer =  (int) Math.pow(10 * firstVal + list.get(0), 2);
        	}
        	else {					// 2쌍 같음(aabb)
        		answer = (list.get(0)+list.get(1)) * Math.abs(list.get(0)-list.get(1));
        	}
        }
        else if (list.size() == 3) {	// 2개 같음(aabc)
        	list.remove(Integer.valueOf(firstVal));
        	answer = list.get(0) * list.get(1);
        }
        else {	// 모두 다름
        	answer = Collections.min(list);
        }
        return answer;
    }

 

 

a, b, c, d를 list에 넣을 건데, 이미 list에 있는 값이라면 중복 발생으로 간주하고, firstVal에 저장한다.

 

두 번째 중복 발생 (예를들어, 1, 1 저장 후 1이 발생 || 1, 1 저장 후 2, 2가 발생) 한 경우

 

secondVal에 두 번째 중복값을 저장한다.

 

 

 

 

이후, 중복이 두 번 발생하는 경우 (1,1,1 || 1,1,2,2) 를 구분하기 위해 firstVal과 secondVal를 비교한다.

 

firstVal 과 secondVal이 같은 값이라면, 1,1,1,n 과 같은 3개 중복 주사위일 것이다.

 

 

 

이런식으로 풀이해나갔다.

 

 

 

 


 

 

 

이후 프로그래머스에서 모범 답안을 보고 놀랐다.

 

 

모범 답안

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];
        } else if (dice[0] == dice[2] || dice[1] == dice[3]) {
            ans = (int) Math.pow(dice[1] * 10 + (dice[0] + dice[3] - dice[1]), 2);
        } else if (dice[0] == dice[1] && dice[2] == dice[3]) {
            ans = (dice[0] + dice[3]) * (dice[3] - dice[0]);
        } 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];
        } else {
            ans = dice[0];
        }

        return ans;
    }
}

 

 

 

정렬을 써서 이렇게 깔끔하게 작성하다니...

 

한 수 배워간다.