[코딩테스트연습] 코딩 기초 트레이닝 > Lv.0 주사위 게임3

2024. 3. 10. 22:33코딩 테스트/[프로그래머스] Java

문제 설명


문제 풀이

import java.util.*;

class Solution {
    public int solution(int a, int b, int c, int d) {
        int answer = 0;
        
        int[] intArray = new int[7];
        intArray[a] += 1;
        intArray[b] += 1;
        intArray[c] += 1;
        intArray[d] += 1;

        // int 배열을 Integer 리스트로 변환
        List<Integer> intList = new ArrayList<>();
        for (int num : intArray) {
            intList.add(num);
        }
        
        if(intList.containsAll(Arrays.asList(4))) {
            for(int i=1; i<7; i++){
                if(intArray[i] == 4) return 1111*i;
            }
        } else if(intList.containsAll(Arrays.asList(1,3))){
            int p=0,q=0;
            for(int i=1; i<7; i++){
                if(intArray[i] == 3) p=i;
                if(intArray[i]==1) q=i;
            }
            return (int)Math.pow(10*p+q, 2);
            
        } else if(intList.containsAll(Arrays.asList(2,2))){
            int p=0,q=0;
            for(int i=1; i<7; i++){
                if(intArray[i] == 2 & p==0) p=i;
                if(intArray[i] == 2 & p!=0) q=i;
            }
            return (p+q) * Math.abs(p-q);
        } else if(intList.containsAll(Arrays.asList(1,1,2))){
            int p=0,q=0,r=0;
            for(int i=1; i<7; i++){
                if(intArray[i]==2) p=i;
                if(intArray[i] == 1 & q==0) q=i;
                if(intArray[i] == 1 & q!=0) r=i;
            }
            return q*r;
        } else if(intList.containsAll(Arrays.asList(1,1,1,1))){
            int min=6;
            for(int i=1; i<7; i++){
                if(intArray[i] != 1 && min > intArray[i]) min=i;
            }
            System.out.print(min);
            return min;
        }

        return answer;
    }
}

하나하나 경우의 수를 따져가면서 코드를 작성해 보았다.

사실 한눈에봐도 너무 복잡해보였지만 우선 실행이 되는지 확인해보기로 했다.

하지만 마지막 테스트 2개에서 실패했다!

1,1,2일 때와 1,1,1,1일 때가 적용이 되고 있지 않아 보였다.

Arrays.asList(1,1,2)는 1,1,2 이렇게 정해진 순서일 때만 해당되는 거였다..! 

순서 관계 없이 원소 포함 여부만 알고 싶었는데, 이 방법은 set을 만들어서 이용하라고 했다.

하지만 이번 문제에서는 Array, List, contains 등으로 풀어보고자 다시 수정해보았다.

 

[try2]

import java.util.*;

class Solution {
    public int solution(int a, int b, int c, int d) {
        int answer = 0;
        
        int[] intArray = new int[7];
        intArray[a]++;
        intArray[b]++;
        intArray[c]++;
        intArray[d]++;

        // 각 주사위의 나온 횟수 출력
        for(int i=1; i<=6; i++){
            System.out.println("주사위 " + i + ": " + intArray[i]);
        }

        // 주사위 값이 나온 횟수를 리스트로 변환
        List<Integer> intList = new ArrayList<>();
        for (int num : intArray) {
            intList.add(num);
        }
        
        if(intList.contains(4)) {
            for(int i=1; i<=6; i++){
                if(intArray[i] == 4) return 1111*i;
            }
        } else if(intList.contains(3) && intList.contains(1)){
            int p=0, q=0;
            for(int i=1; i<=6; i++){
                if(intArray[i] == 3) p=i;
                if(intArray[i] == 1) q=i;
            }
            return (int)Math.pow(10*p+q, 2);
        } else if(intList.contains(2) && Collections.frequency(intList, 2) == 2){
            int p=0, q=0;
            for(int i=1; i<=6; i++){
                if(intArray[i] == 2 && p == 0) p=i;
                if(intArray[i] == 2 && p != 0) q=i;
            }
            return (p+q) * Math.abs(p-q);
        } else if(intList.contains(2) && Collections.frequency(intList, 1) == 2){
            int p=0, q=0, r=0;
            for(int i=1; i<=6; i++){
                if(intArray[i] == 2) p=i;
                if(intArray[i] == 1 && q == 0) q=i;
                if(intArray[i] == 1 && q != 0) r=i;
            }
            return q*r;
        } else {
            int min = 6;
            for(int i=1; i<=6; i++){
                if(intArray[i] == 1 && i < min) min=i;
            }
            System.out.println("최소값: " + min);
            return min;
        }

        return answer;
    }
}

contains() 메소드를 이용해서 4 또는 3을 가지고 있는지 유무를 파악하는 방법을 사용했다.

또, Collections 클래스의 frequency 메서드는 주어진 리스트 안에 특정 요소의 출현 횟수를 반환한다. 이 경우에는 리스트 intList 안에 숫자 2가 몇 번 등장하는지를 반환합니다. 따라서 이를 이용해서 2가 2번 나왔을 때를 찾아낸다.

위와 같은 메소드들을 적용해서 다시 해결해보았다.

 

무지 지저분한 코드지만..어찌저찌 성공은 했다.............

 

다른 사람의 코드를 보던 중, 

입력받은 숫자들을 배열에 넣고 이를 정렬해서 여러가지 경우의 수를 세운 사람을 보았다.

이런 접근 방법도 있구나.. 조금 더 수학적으로 접근해야 더 쉽게 풀 수 있을 것 같다고 어려운 문제를 만날때면 늘 생각한다.................. 화이팅..!😶‍🌫️