[프로그래머스 | JS] Lv0. 주사위 게임 3

HICHULOG·2023년 10월 31일
0

프로그래머스

목록 보기
33/38
post-thumbnail

주사위 게임 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점을 얻습니다.
  • 네 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자 만큼의 점수를 얻습니다.

네 주사위를 굴렸을 때 나온 숫자가 정수 매개변수 a, b, c, d로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.

⛔️ 제한 사항

  • a, b, c, d는 1 이상 6 이하의 정수입니다.

👁️ 입출력 예

abcdresult
22222222
41441681
633627
252630
64252

💡 풀이

function solution(a, b, c, d) {
    let dice = [a,b,c,d];

    const maxValue = Math.max(...dice);
    const minValue = Math.min(...dice); 

    let maxCount = 0;
    let minCount = 0; 


    dice.forEach((el)=>{
        if(el === maxValue){
            maxCount++
        }
        else if(el === minValue){
            minCount++
        }
    })

    if(maxCount === 4) return maxValue*1111;
    if(maxCount===3){
        return Math.pow(10*maxValue+minValue,2);
    }
    if(minCount===3){
        return Math.pow(10*minValue+maxValue,2);
    }
    if(minCount ===2 && maxCount === 2){
        return (minValue+maxValue)*Math.abs(minValue-maxValue);
    }

    if(a === b){
        return c * d;
    }
    if(a === c){
        return b * d;
    }
    if(a === d){
        return b * c;
    }
    if(b === c){
        return a * d;
    }
    if(b === d){
        return a * c;
    }
    if(c === d){
        return a * b;
    }


    else{
        return minValue;
    }
}

=> 같은 주사위 숫자가 2개일때를 처리하는게 어려웠다.

✅ 다른 풀이

function solution(a, b, c, d) {
    if (a === b && a === c && a === d) return 1111 * a

    if (a === b && a === c) return (10 * a + d) ** 2
    if (a === b && a === d) return (10 * a + c) ** 2
    if (a === c && a === d) return (10 * a + b) ** 2
    if (b === c && b === d) return (10 * b + a) ** 2

    if (a === b && c === d) return (a + c) * Math.abs(a - c)
    if (a === c && b === d) return (a + b) * Math.abs(a - b)
    if (a === d && b === c) return (a + b) * Math.abs(a - b)

    if (a === b) return c * d
    if (a === c) return b * d
    if (a === d) return b * c
    if (b === c) return a * d
    if (b === d) return a * c
    if (c === d) return a * b

    return Math.min(a, b, c, d)
}

=> 모든 조건을 노가다로 나열해서 푼 풀이가 오히려 깔끔하고 이해하기가 쉬웠다.

function count(arr) {
  const counter = new Map();
  for (const num of arr) {
    counter.set(num, (counter.get(num) || 0) + 1);
  }
  const sortedByCnt = [...counter.keys()].sort((a, b) => counter.get(b) - counter.get(a));
  const maxCnt = Math.max(...counter.values());
  return [sortedByCnt, maxCnt];
}

function solution(a, b, c, d) {
  const [arr, maxCnt] = count([a, b, c, d]);
  const [p, q, r, s] = arr;
  if (arr.length === 1) {
    return p * 1111;
  }
  if (arr.length === 2) {
    return maxCnt === 2 ? (p + q) * Math.abs(p - q) : (10 * p + q) ** 2;
  }
  if (arr.length === 3) {
    return q * r;
  }
  return Math.min(p, q, r, s);
}

=> 아직은 이해하기 어려운 코드이다. 나중에 보고 아 이게 이래서 이렇게 풀었구나 오는 날이 왔으면 좋겠다.

🚀 TIL

profile
🚀 Front-end Dev

0개의 댓글