문제
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점을 얻습니다.
- 네 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자 만큼의 점수를 얻습니다.
네 주사위를 굴렸을 때 나온 숫자가 정수 매개변수
a
, b
, c
, d
로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.제한사항
•
a
, b
, c
, d
는 1 이상 6 이하의 정수입니다.예시

풀이
해당 로직은 네 개의 정수
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