관리 메뉴

100세까지 코딩

[프로그래머스] Lv0.주사위 게임 본문

코딩테스트/자바

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

100세까지 코딩 2023. 8. 26. 23:41
문제 설명

 

풀기 전 생각
  • 4개의 숫자를 배열에 넣어 오름차순으로 정렬하기
  • 반복문을 돌려 i와 i+1을 비교해서 같으면 same ++ 하고 sameValue에 값 넣기
  • 이전 sameValue가  0이 아니고 현재 값과 다르면 중복이 2개라는 표시하기
  • 앞과 비교해서 다르면 이전 중복 값과 현재 값이 비교,
    같으면 arr[i+1]을 differentValue에 넣고 그 이외에는 arr [i]를 differentValue에 넣기
  • same과 twoSameValue로 경우를 나눠 게임 방식대로 계산

class Solution {
    public int solution(int a,int b, int c, int d) {
        int[] arr = {a, b, c, d};
        int answer = 0;
        int same = 0;  // 중복이 나온 횟수
        int sameValue = 0;  // 중복 값
        int differentValue = 0; // 다른 것의 값
        int twoSameValue = 0;  // 22,44 처럼 중복인게 2개인것

        Arrays.sort(arr); // Array를 써서 정렬

        for(int i = 0; i < arr.length-1; i++) {
            if(arr[i] == arr[i+1]) {  // 앞과 비교
                same++;  // 중복이니깐 same + 1
                if(sameValue!=arr[i] && sameValue!=0){  // 이전 중복 값이 지금 값과 다르고 이전 값이 없지 않으면
                    twoSameValue++;  // 22, 44 처럼 중복이 2개인것
                }
                sameValue = arr[i]; // 중복 값 넣기
            }else {
                if(sameValue == arr[i]){ // 이전 중복 값이 현재와 같으면
                    differentValue = arr[i+1]; // 중복에서 다음으로 넘어가는거니깐 다음 값이 다른값 ex) 2234에서 2->3
                }else {
                    differentValue = arr[i]; // 그렇지않으면 지금이 다른값
                }
            }
        }

        if(same == 3){  // 3쌍의 중복값이 나오면 4개 다 동일 ex) 2222
            answer = sameValue * 1111;
        }else if(same == 2 && twoSameValue == 0 ){ // 2쌍의 중복 값과 중복 값 자체가 2개는 아님 ex) 2223
            answer = (10*sameValue + differentValue)*(10*sameValue + differentValue);
        }else if(same == 2 && twoSameValue == 1 ){ // 2쌍의 중복 값과 중복 값 자체가 2개 ex) 2233
            answer = (arr[0] + arr[3]) * Math.abs(arr[0]-arr[3]);
        }else if(same == 1) {  // 1쌍의 중복값  ex) 1223
            answer = 1;  // 곱하기 위함
            for(int i = 0; i < arr.length; i++) {
                if(arr[i] != sameValue){  // 중복 값이 아닌 것들만 곱해주기
                    answer *= arr[i];
                }
            }
        }else { // 4개의 숫자가 다 다른것 ex) 1234
            answer = arr[0]; // 가장 작은 숫자 반환
        }
        return answer;
    }
}
오류 및 개선
  • 오류는 없었지만 중간 중간에 경우 나누기가 헷갈렸음
  • 조잡하다는 느낌을 받음
  • 정렬한 배열의 규칙을 찾아 경우를 다 나눠 새로 코드를 짜봄
  • 모범 코드도 새로 짠 코드와 비슷
최종
class Solution {
    public int solution(int a,int b, int c, int d) {
        int[] arr = {a, b, c, d};
        int answer = 0;

        Arrays.sort(arr); // Array를 써서 정렬

        if (arr[0] == arr[3]) {  // 정렬 후 처음과 끝이 같으면 4개 다 같음
            answer = 1111 * arr[3];
        } else if (arr[0] == arr[2] || arr[1] == arr[3]) { // 1번째 == 3번쨰 || 2번째 == 4번째 3개가 같은 것 
            answer = (int) Math.pow(arr[1] * 10 + (arr[0] + arr[3] - arr[1]), 2);
        } else if (arr[0] == arr[1] && arr[2] == arr[3]) { // 1번째 == 2번째 && 3번째 == 4번째 2개 2개 같은 것
            answer = (arr[0] + arr[3]) * (arr[3] - arr[0]);
        } else if (arr[0] == arr[1]) { // 1번째 == 2번째 하나만 같은 것
            answer = arr[2] * arr[3];
        } else if (arr[1] == arr[2]) {  // 2번째 == 3번째 하나만 같은 것
            answer = arr[0] * arr[3];
        } else if (arr[2] == arr[3]) {  // 3번째 == 4번째 하나만 같은 것
            answer = arr[0] * arr[1];
        } else {  // 그 이외는 같은 것이 하나도 없는 것
            answer = arr[0];
        }

        return answer;
    }
}
간단하게 생각하자!