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

조예빈·2024년 8월 12일
0

Coding Test

목록 보기
106/138

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

빡구현 문제가 이런게 아닐까 싶다.. 문제 자체는 복잡하지 않지만, 구현 코드가 길다.. 모든 조건을 따져 주어야 하기 때문인 것 같다.

우선, 나는 해시맵으로 구현하였다. Key값을 주사위의 number로, value값을 개수로 넣었다. 해시맵의 단점은 'key'값을 직접 구하지 못한다는 것이다. 그래서 각 조건문에서 key값을 새로운 list로 만들어 주었고, 그 list에서의 개수는 정해져 있으므로 index 번호로 접근해 문제를 해결하였다.

import java.util.*;

class Solution {
    public int solution(int a, int b, int c, int d) {
        // 네 개 전부 같으면 1111*p
        // 세개만 같으면 (10 * p + q) ^ 2
        // 두개씩 같으면 (p+q) * |p-q|
        // 두개는 같고 나머지는 다르면
        // 모두 다르면 가장 작은 숫자만큼
        int answer = 0;
        HashMap<Integer, Integer> map = new HashMap<>(); //<Key, Value> = <주사위 수, 개수>
        int[] dice = {a, b, c, d};
        for(int i=0; i<4; i++){
            if(!map.containsKey(dice[i])){
                map.put(dice[i], 1);
            }else{
                map.put(dice[i], map.get(dice[i])+1);
            }
        }
        if(map.size() == 1){
            answer = 1111 * a;
        }else if(map.size() == 2){
            List<Integer> list = new LinkedList<>(map.keySet()); //모든 키를 가져옴
            
            if(map.get(list.get(0)) == 3){
                int p = list.get(0);
                int q = list.get(1);
                answer = (10 * p + q) * (10 * p + q);
            }else if(map.get(list.get(1)) == 3){
                int p = list.get(1);
                int q = list.get(0);
                answer = (10 * p + q) * (10 * p + q);
            }
            if(map.get(list.get(0)) == 2 && map.get(list.get(1)) == 2){
                int p = list.get(0);
                int q = list.get(1);
                if(p > q){
                    answer = (p + q) * (p - q);
                }else{
                    answer = (p + q) * (q - p);
                }
            }
        }else if(map.size() == 3){
            List<Integer> list = new LinkedList<>(map.keySet());
            if(map.get(list.get(0)) == 2){
                int p = list.get(0);
                answer = list.get(1) * list.get(2);
            }else if(map.get(list.get(1)) == 2){
                int p = list.get(1);
                answer = list.get(0) * list.get(2);
            }else if(map.get(list.get(2)) == 2){
                int p = list.get(2);
                answer = list.get(1) * list.get(0);
            }
        }else if(map.size() == 4){
            List<Integer> list = new LinkedList<>(map.keySet());
            Collections.sort(list); //오름차순 정렬
            answer = list.get(0);
        }
        return answer;
    }
}

나는 위처럼 길게 풀었지만, 내 친구는 a,b,c,d를 배열에 넣고 그 배열을 정렬한 후 조건을 하나하나 비교하는 식으로 문제를 풀었다. 정렬을 해서 푸는건 생각하지 못했는데, 신박했다.

profile
컴퓨터가 이해하는 코드는 바보도 작성할 수 있다. 사람이 이해하도록 작성하는 프로그래머가 진정한 실력자다. -마틴 파울러

0개의 댓글