[코딩테스트] 54. 주사위 게임 3

윤설안's avatar
Jul 28, 2025
[코딩테스트] 54. 주사위 게임 3

문제

💡
1부터 6까지 숫자가 적힌 주사위가 네 개 있습니다. 네 주사위를 굴렸을 때 나온 숫자에 따라 다음과 같은 점수를 얻습니다.
  • 네 주사위에서 나온 숫자가 모두 p로 같다면 1111 × p점을 얻습니다.
  • 세 주사위에서 나온 숫자가 p로 같고 나머지 다른 주사위에서 나온 숫자가 q(p ≠ q)라면 (10 × p + q) 점을 얻습니다.
    • 2
  • 주사위가 두 개씩 같은 값이 나오고, 나온 숫자를 각각 p, q(p ≠ q)라고 한다면 (p + q) × |p - q|점을 얻습니다.
  • 어느 두 주사위에서 나온 숫자가 p로 같고 나머지 두 주사위에서 나온 숫자가 각각 p와 다른 q, r(q ≠ r)이라면 q × r점을 얻습니다.
  • 네 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자 만큼의 점수를 얻습니다.
네 주사위를 굴렸을 때 나온 숫자가 정수 매개변수 abcd로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.

제한사항

abcd는 1 이상 6 이하의 정수입니다.

예시

notion image

풀이

해당 로직은 네 개의 정수 a, b, c, d를 입력받아 특정 조건에 따라 점수를 계산하는 문제입니다.
이를 위해 다음과 같은 순서로 코드를 구성하였습니다.

1. 입력값을 배열로 저장

int[] dice = {a, b, c, d};
네 개의 정수를 배열 dice에 저장하여 반복문을 통해 처리하기 쉽게 구성하였습니다.

2. 주사위 숫자 등장 횟수 계산

Map<Integer, Integer> countMap = new HashMap<>(); for (int num : dice) { countMap.put(num, countMap.getOrDefault(num, 0) + 1); }
  • Map<Integer, Integer>를 이용해 각 주사위 숫자의 등장 횟수를 저장합니다.
  • getOrDefault(num, 0)을 통해 기존에 존재하지 않는 숫자라면 기본값 0으로 시작해 카운트합니다.
  • put()을 사용하여 계속해서 값을 갱신합니다. (※ add()는 List에서 사용하는 메서드로, 여기서는 잘못된 표현입니다.)

3. Map → List로 변환 및 정렬

List<Map.Entry<Integer, Integer>> entryList = new ArrayList<>(countMap.entrySet()); entryList.sort((e1, e2) -> e2.getValue().compareTo(e1.getValue()));
  • Map을 리스트로 변환하여 정렬을 수행합니다. 아래와 같이 데이터가 표시 됩니다.
    • { 3 = 2, // 숫자 3이 2번 등장 2 = 2 // 숫자 2가 2번 등장 }
  • 등장 횟수(value)를 기준으로 내림차순 정렬하여 가장 많이 등장한 숫자가 먼저 오도록 정렬합니다.

4. 규칙에 따른 점수 계산

조건 1: 네 개 숫자가 모두 같음

if (entryList.size() == 1) { answer = 1111 * entryList.get(0).getKey(); }
  • 등장한 숫자가 하나이므로 네 개가 모두 동일한 경우입니다.

조건 2: 두 숫자만 존재

else if (entryList.size() == 2) { Integer pCount = entryList.get(0).getValue(); Integer p = entryList.get(0).getKey(); Integer q = entryList.get(1).getKey(); if (pCount == 3) { answer = (10 * p + q) * (10 * p + q); // 세 개 + 하나 } else { answer = (p + q) * Math.abs(p - q); // 두 개 + 두 개 } }
  • 등장한 숫자가 두 개일 경우, 각각 3-1 또는 2-2 패턴이 가능합니다.
  • 등장 횟수로 3-1을 판단하여 계산식을 다르게 적용합니다.

조건 3: 세 숫자 존재 (2-1-1)

else if (entryList.size() == 3) { Integer q = entryList.get(1).getKey(); Integer r = entryList.get(2).getKey(); answer = q * r; }
  • 같은 숫자가 두 개, 나머지 두 개는 각각 다른 숫자인 경우입니다.
  • 중복되지 않은 두 숫자의 곱을 정답으로 반환합니다.

조건 4: 모두 다른 숫자

else { Arrays.sort(dice); answer = dice[0]; }
  • 네 숫자가 전부 다를 경우, 가장 작은 값을 정답으로 합니다.

전체 코드

import java.util.*; public class Ex31 { public static void main(String[] args) { int a = 4; int b = 1; int c = 2; int d = 3; int answer = 0; int[] dice = {a, b, c, d}; Map<Integer, Integer> countMap = new HashMap<>(); for (int num : dice) { countMap.put(num, countMap.getOrDefault(num, 0) + 1); } // Map.Entry 리스트로 변환 List<Map.Entry<Integer, Integer>> entryList = new ArrayList<>(countMap.entrySet()); // value 기준으로 내림차순 정렬 entryList.sort((e1, e2) -> e2.getValue().compareTo(e1.getValue())); if (entryList.size() == 1) { Integer p = entryList.get(0).getKey(); answer = 1111 * p; } else if (entryList.size() == 2) { Integer pCount = entryList.get(0).getValue(); Integer p = entryList.get(0).getKey(); Integer q = entryList.get(1).getKey(); if (pCount == 3) { answer = (10 * p + q) * (10 * p + q); } else { answer = (p + q) * (Math.abs(p - q)); } } else if (entryList.size() == 3) { Integer q = entryList.get(1).getKey(); Integer r = entryList.get(2).getKey(); answer = q * r; } else { Arrays.sort(dice); answer = dice[0]; } System.out.println(answer); } }
Share article

An's Blog