본문 바로가기

프로그래머스(Java)/Level 0

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

728x90

코드 힌트

  1. 배열 정렬을 이용한 접근:
    • 입력된 4개의 정수를 배열에 저장하고, 배열을 오름차순으로 정렬합니다.
    • 정렬된 배열을 기반으로 각 숫자의 빈도와 위치를 쉽게 확인할 수 있습니다.
    • 조건 예시:
      • 만약 정렬된 배열의 결과가 a, b, c, d일 때:
        • if a == d: 모든 값이 동일합니다. (예: [2, 2, 2, 2])
        • else if a == c || b == d: 3개의 숫자가 같고 1개가 다릅니다. (예: [2, 2, 2, 3] 또는 [1, 2, 2, 2])
      • 추가적인 조건문은 스스로 생각해서 해보시는 것을 추천합니다.
  2. 조건문 작성:
    • 모든 숫자가 같을 경우: 배열의 모든 값이 동일하면 결과는 1111 * a입니다. (예: [3, 3, 3, 3] → 1111 * 3)
    • 3개의 숫자가 같고 1개가 다른 경우: 배열에서 같은 숫자가 3번 출현하고, 나머지 1개의 숫자가 다를 때, 결과는 (10 * (같은 숫자) + (다른 숫자))^2입니다. (예: [2, 2, 2, 3] → (10 * 2 + 3)^2)
    • 2개의 숫자가 각각 2개씩 반복되는 경우: 배열에서 두 개의 숫자가 각각 두 번씩 출현할 때, 결과는 (숫자1 + 숫자2) * |숫자1 - 숫자2|입니다. (예: [1, 1, 2, 2] → (1 + 2) * |1 - 2|)
    • 3개의 숫자가 모두 다를 경우: 배열에서 서로 다른 숫자가 3개 있을 때, 결과는 중간값 * 최대값입니다. (예: [1, 2, 3, 4] → 2 * 3)
  3. HashMap 사용해보기:
    HashMap을 이용해서 문제를 풀 수 있습니다. HashMap을 연습하고 싶으신 분은 해보시는 걸 추천합니다.
    HashMap 정답도 밑에 적어놓았습니다.
    • 빈도수 기록: HashMap을 사용하여 각 숫자의 출현 빈도를 기록합니다. key는 숫자, value는 출현 횟수입니다.
    • 키 추출 및 정렬: keySet() 메서드를 통해 key를 추출하고, 빈도수 기준으로 정렬하여 조건을 확인합니다.
    • 가독성 및 효율성: HashMap을 사용하는 경우, 빈도수의 계산과 조건 검토가 효율적이며, 코드의 가독성도 높일 수 있습니다.

 


정답은 더보기 클릭

더보기
import java.util.Arrays;

class Solution {
    public int solution(int a, int b, int c, int d) {
        // 입력된 4개의 정수를 배열에 저장
        int[] arr = {a, b, c, d};
        
        // 배열을 오름차순으로 정렬
        Arrays.sort(arr);
        
        // 정렬된 배열에서 값의 빈도수를 체크
        
        // 모든 숫자가 같을 경우
        // 예: [2, 2, 2, 2] 
        if (arr[0] == arr[3]) {
            return 1111 * arr[0];  // 모든 숫자가 동일하므로, 1111 * 그 숫자를 반환
        } 
        
        // 3개의 숫자가 같고 1개가 다른 경우
        // 예: [1, 3, 3, 3] 또는 [1, 1, 1, 3]
        else if (arr[0] == arr[2] || arr[1] == arr[3]) {
            int p = arr[2];  // 중복된 수 (예: 3)
            int q = arr[3] + arr[0] - arr[2];  // 중복되지 않은 수 (예: 1)
            return (int) Math.pow(10 * p + q, 2);  // 결과: (10 * p + q) ^ 2
        } 
        
        // 2개의 숫자가 각각 2개씩 반복되는 경우
        // 예: [1, 1, 2, 2]
        else if (arr[0] == arr[1] && arr[2] == arr[3]) {
            return (arr[0] + arr[2]) * (arr[2] - arr[0]);  // (숫자1 + 숫자2) * |숫자2 - 숫자1|
        } 
        
        // 2개의 숫자가 같고 나머지 2개의 수는 다를 때
        // 예: [1, 1, 2, 3]
        else if (arr[0] == arr[1]) {
            return arr[2] * arr[3];  // 두 다른 숫자의 곱을 반환
        }
        else if (arr[1] == arr[2]) {
            return arr[0] * arr[3];  // 두 다른 숫자의 곱을 반환
        }
        else if (arr[2] == arr[3]) {
            return arr[0] * arr[1];  // 두 다른 숫자의 곱을 반환
        }
        
        // 모든 숫자가 다를 때
        // 예: [1, 2, 3, 4]
        else {
            return arr[0];  // 가장 작은 숫자를 반환
        }
    }
}

 

HashMap 정답

import java.util.*;

class Solution {
    public int solution(int a, int b, int c, int d) {
        // 입력된 4개의 정수를 배열에 저장
        int[] arr = {a, b, c, d};
        
        // 각 숫자의 출현 빈도를 저장할 HashMap 생성
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int n : arr) {
            // 숫자의 출현 빈도 업데이트
            map.put(n, map.getOrDefault(n, 0) + 1);
        }
        
        // HashMap의 키를 리스트에 저장하고, 빈도수 기준으로 내림차순 정렬
        List<Integer> keySet = new ArrayList<>(map.keySet());
        Collections.sort(keySet, (o1, o2) -> map.get(o2).compareTo(map.get(o1)));
        
        // 조건에 따라 결과를 계산
        if (map.size() == 1) {
            // 모든 숫자가 같을 경우
            return 1111 * a;
        } else if (map.size() == 2 && map.get(keySet.get(0)) == 3) {
            // 3개의 숫자가 같고 나머지 1개가 다른 경우
            return (int) Math.pow((10 * keySet.get(0) + keySet.get(1)), 2);
        } else if (map.size() == 2 && map.get(keySet.get(0)) == 2) {
            // 2개의 숫자가 각각 2개씩 반복되는 경우
            int n = keySet.get(0);
            int m = keySet.get(1);
            return (n + m) * Math.abs(n - m);
        } else if (map.size() == 3) {
            // 3개의 숫자가 모두 다를 경우
            return keySet.get(1) * keySet.get(2);
        }
        
        // 위의 모든 조건에 해당하지 않는 경우
        return keySet.get(0);
    }
}
728x90