문제
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 이하의 정수입니다.
import java.util.HashMap;
import java.util.ArrayList;
class Solution {
public int solution(int a, int b, int c, int d) {
int answer = 7;
HashMap<Integer, Integer> diceResult = new HashMap<Integer, Integer>();
diceResult.put(a, diceResult.getOrDefault(a, 0) + 1);
diceResult.put(b, diceResult.getOrDefault(b, 0) + 1);
diceResult.put(c, diceResult.getOrDefault(c, 0) + 1);
diceResult.put(d, diceResult.getOrDefault(d, 0) + 1);
// System.out.println(diceResult);
ArrayList<Integer> diceResultKey = new ArrayList<Integer>();
for(Integer dice : diceResult.keySet()) {
diceResultKey.add(dice);
}
int diceResultKeyLen = diceResultKey.size();
if(diceResultKeyLen == 1) {
answer = 1111 * diceResultKey.get(0);
}
else if(diceResultKeyLen == 2) {
int dice1 = diceResultKey.get(0);
int dice2 = diceResultKey.get(1);
if((diceResult.get(dice1) == 1 && diceResult.get(dice2) == 3)) {
//(10 × p + q)^2
answer = (int)Math.pow((10 * dice2 + dice1), 2);
}
else if((diceResult.get(dice1) == 3 && diceResult.get(dice2) == 1)) {
answer = (int)Math.pow((10 * dice1 + dice2), 2);
}
else if(diceResult.get(dice1) == diceResult.get(dice2)) {
answer = (dice1 + dice2) * Math.abs(dice1 - dice2);
}
}
else if(diceResultKeyLen == 3) {
int dice1 = diceResultKey.get(0);
int dice2 = diceResultKey.get(1);
int dice3 = diceResultKey.get(2);
if(diceResult.get(dice1) == 2) {
answer = dice2 * dice3;
}
else if(diceResult.get(dice2) == 2) {
answer = dice1 * dice3;
}
else if(diceResult.get(dice3) == 2) {
answer = dice1 * dice2;
}
}
else if(diceResultKeyLen == 4) {
for(int i = 0; i < diceResultKeyLen; i++) {
answer = Math.min(answer, diceResultKey.get(i));
}
}
return answer;
}
}
괜히 길기만 길고 사실 시물레이션 문제답게 문제에 주어진 조건을 그저 조건문으로 나열했을 뿐이다.
처음엔 a, b, c, d 중 중복된 값을 추려내야 하므로 hashMap을 쓰기로 하였다.
getOrDefault() 메서드를 통해 중복된 key는 value 값을 1 증가시켜서 중복이 몇 번 되는지 판단하였다.
만들어진 hashMap 의 길이를 통해 중복이 어떻게 나왔는지 대략적으로 파악한다.
길이가 4라면, 이는 a, b, c, d 모두 다른 값이라는 뜻이다.
길이가 3이라면, a, b, c, d 중 두 개의 값이 같고 두 개의 값이 다른 경우다
길이가 2인 경우에는 좀 갈리는데, 첫번째 경우는, 네 개의 숫자가 2개씩 같은 값이 나온 경우이다. 그리고 두 번째 경우는 3개의 값이 같고 나머지 한 개가 다른 경우이다.
예를 들어서 4와 5 두 개의 쌍이 나왔다고 치면,
4가 두 개, 5가 두 개
4가 한 개, 5가 세 개
4가 세 개, 5가 한 개
이렇게 세 가지 경우가 나온다.
마지막으로 길이가 1인 경우는 모두 같은 값이라는 뜻이다.
이 조건을 사용해서 해결하였다.
출처
https://school.programmers.co.kr/learn/courses/30/lessons/181916