주사위 게임3

도비김·2024년 2월 23일
0
문제 설명

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 result
2 2 2 2 2222
4 1 4 4 1681
6 3 3 6 27
2 5 2 6 30
6 4 2 5 2

입출력 예 설명

입출력 예 #1

  • 예제 1번에서 네 주사위 숫자가 모두 2로 같으므로 1111 × 2 = 2222점을 얻습니다. 따라서 2222를 return 합니다.

입출력 예 #2

  • 예제 2번에서 세 주사위에서 나온 숫자가 4로 같고 나머지 다른 주사위에서 나온 숫자가 1이므로 (10 × 4 + 1)2 = 412 = 1681점을 얻습니다. 따라서 1681을 return 합니다.

입출력 예 #3

  • 예제 3번에서 a, d는 6으로, b, c는 3으로 각각 같으므로 (6 + 3) × |6 - 3| = 9 × 3 = 27점을 얻습니다. 따라서 27을 return 합니다.

입출력 예 #4

  • 예제 4번에서 두 주사위에서 2가 나오고 나머지 다른 두 주사위에서 각각 5, 6이 나왔으므로 5 × 6 = 30점을 얻습니다. 따라서 30을 return 합니다.

입출력 예 #5

  • 예제 5번에서 네 주사위 숫자가 모두 다르고 나온 숫자 중 가장 작은 숫자가 2이므로 2점을 얻습니다. 따라서 2를 return 합니다.

solution

var answer = 0;
    let result = {};
    [a,b,c,d].forEach((x) => { result[x] = (result[x] || 0)+1; }); //중복수 객체로 정리 (오름차순)
    let k = Object.keys(result); // key배열 (오름차순)
    let v = Object.values(result); // value배열 (key순)
        // key 값은 */가 바로 붙는거 아니면 parseInt나 Number 붙여주기
    switch (String(Math.max(...v))) {
        case '4' : answer = 1111*a;
            break;
        case '3' : answer = (v[0]===3 ? k[0]*10+Number(k[1]) : k[1]*10+Number(k[0]))**2;
            break;
        case '2' :
            if(v[0]===2) answer = k[1]*k[2];
            if(v[1]===2) answer = k[0]*k[2];
            if(v[2]===2) answer = k[0]*k[1];
            if(!v[2]) answer = (Number(k[0])+Number(k[1]))*Math.abs(Number(k[0])-Number(k[1]));
            break;
        case '1' : answer = Number(k[0]);
            break;
            default : answer = 0;
    }
    return answer;

중복 수 구하기, 겹치는 수 제외하기 공부, 객체->배열

다른풀이

const map = new Map();
  for (const data of [a, b, c, d]) {
    map.set(data, (map.get(data) || 0) + 1)
  };
  const sortedArr = [...map].sort((a, b) => {if (a[1] === b[1]) return b[0] - a[0]; else return b[1] - a[1]});
  if (map.size === 1) return 1111 * sortedArr[0][0];
  else if (map.size === 3) return sortedArr[1][0] * sortedArr[2][0];
  else if (map.size === 4) return sortedArr[3][0];
  else if (sortedArr[0][1] === 3) return (10 * sortedArr[0][0] + sortedArr[1][0]) ** 2;
  else return (sortedArr[0][0] + sortedArr[1][0]) * (sortedArr[0][0] - sortedArr[1][0]);

function solution(a, b, c, d) {
    const res = [a, b, c, d]
        .map(e => [[a, b, c, d].filter(el => e === el).length, e])
        .sort((a, b) => a[0] !== b[0] ? b[0] - a[0] : b[1] - a[1])
    const sort = res.map(e => e[0])
    const arr = res.map(e => e[1])
    return ([
        arr[3],
        (arr[0] + arr[2]) * (arr[0] - arr[2]),
        Number(String(arr[0]) + String(arr[3])) ** 2,
        Number(arr.join('')),
        arr[2] * arr[3]
    ][sort[0] - 1 === 1 ? sort[2] === 1 ? 4 : 1 : sort[0] - 1])
}
profile
To Infinity, and Beyond!

0개의 댓글