https://school.programmers.co.kr/learn/courses/30/lessons/181916
빡구현 문제가 이런게 아닐까 싶다.. 문제 자체는 복잡하지 않지만, 구현 코드가 길다.. 모든 조건을 따져 주어야 하기 때문인 것 같다.
우선, 나는 해시맵으로 구현하였다. Key값을 주사위의 number로, value값을 개수로 넣었다. 해시맵의 단점은 'key'값을 직접 구하지 못한다는 것이다. 그래서 각 조건문에서 key값을 새로운 list로 만들어 주었고, 그 list에서의 개수는 정해져 있으므로 index 번호로 접근해 문제를 해결하였다.
import java.util.*;
class Solution {
public int solution(int a, int b, int c, int d) {
// 네 개 전부 같으면 1111*p
// 세개만 같으면 (10 * p + q) ^ 2
// 두개씩 같으면 (p+q) * |p-q|
// 두개는 같고 나머지는 다르면
// 모두 다르면 가장 작은 숫자만큼
int answer = 0;
HashMap<Integer, Integer> map = new HashMap<>(); //<Key, Value> = <주사위 수, 개수>
int[] dice = {a, b, c, d};
for(int i=0; i<4; i++){
if(!map.containsKey(dice[i])){
map.put(dice[i], 1);
}else{
map.put(dice[i], map.get(dice[i])+1);
}
}
if(map.size() == 1){
answer = 1111 * a;
}else if(map.size() == 2){
List<Integer> list = new LinkedList<>(map.keySet()); //모든 키를 가져옴
if(map.get(list.get(0)) == 3){
int p = list.get(0);
int q = list.get(1);
answer = (10 * p + q) * (10 * p + q);
}else if(map.get(list.get(1)) == 3){
int p = list.get(1);
int q = list.get(0);
answer = (10 * p + q) * (10 * p + q);
}
if(map.get(list.get(0)) == 2 && map.get(list.get(1)) == 2){
int p = list.get(0);
int q = list.get(1);
if(p > q){
answer = (p + q) * (p - q);
}else{
answer = (p + q) * (q - p);
}
}
}else if(map.size() == 3){
List<Integer> list = new LinkedList<>(map.keySet());
if(map.get(list.get(0)) == 2){
int p = list.get(0);
answer = list.get(1) * list.get(2);
}else if(map.get(list.get(1)) == 2){
int p = list.get(1);
answer = list.get(0) * list.get(2);
}else if(map.get(list.get(2)) == 2){
int p = list.get(2);
answer = list.get(1) * list.get(0);
}
}else if(map.size() == 4){
List<Integer> list = new LinkedList<>(map.keySet());
Collections.sort(list); //오름차순 정렬
answer = list.get(0);
}
return answer;
}
}
나는 위처럼 길게 풀었지만, 내 친구는 a,b,c,d를 배열에 넣고 그 배열을 정렬한 후 조건을 하나하나 비교하는 식으로 문제를 풀었다. 정렬을 해서 푸는건 생각하지 못했는데, 신박했다.