🖥️Frontend/Programmers

[JavaScript] 주사위 게임 3

뉴발자 2024. 6. 5.
728x90

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

문제

1부터 6까지 적힌 주사위 4개를 던져 나온 수를 매개변수 a, b, c, d로 제공하는 함수가 있다.

 

각 조건별로 점수를 계산하는 방법은 다음과 같다.

 

  • 주사위에서 나온 모든 숫자 p가 같은 경우 1111 x p 점을 획득한다.

 

  • 세 주사위에서 나온 수가 p로 같고 나머지 다른 숫자에서 나온 숫자가 q라면 (10 x p + q)² 점을 획득한다.

 

  • 주사위 두 개씩 같은 값이 나오고, 각 수를 p, q라고 한다면 (p + q) x |p - q| 점을 획득한다.

 

  • 어느 두 주사위에서 나온 값이 p로 같고 나머지 두 주사위에서 나온 값이 q, r로 다른 경우 q x r 점을 획득한다.

 

  •  네 주사위의 수가 모두 다르면 나온 숫자 중 가장 작은 수의 점수를 획득한다. 

 

네 개의 주사위 값으로 계산한 점수를 반환하는 함수를 작성해라.

 

 

예시

주사위 계산식 결과
 [2, 2, 2, 2]  1111 x 2  2222
 [4, 1, 4, 4]  (10 x 4 x 1)²  1681
 [6, 3, 3, 6]  (6 + 3) x |6 - 3|  27
 [2, 5, 2, 6]  5 x 6  30
 [6, 4, 2, 5]  2  2
728x90

 

 

나의 풀이

function solution(a, b, c, d) {
  // 배열 생성
  const arr = [a, b, c, d];
  
  // arr배열의 중복 값 삭제 후 배열 생성
  // 주사위의 숫자를 알아내기 위해서 사용
  let rmDup = Array.from(new Set(arr));
  
  // 각 숫자 갯수를 저장할 배열 생성 (4, 4, 2, 1 => [1, 1, 0, 2, 0, 0])
  const dice = [0 ,0 ,0 ,0, 0, 0];
  
  // 주사위 값으로 해당 숫자의 index에 + 1
  arr.forEach((v) => dice[v-1] += 1);
  // 0이 아닌 값만 넣어서 배열 생성
  let tmp = dice.filter((v) => v != 0);
  
  switch( tmp.length ) {
    case 1:
      return rmDup[0] * 1111;
    case 2:
      return (
        tmp[0] === 2
          ? (rmDup[0] + rmDup[1]) * Math.abs(rmDup[0] - rmDup[1])
            // dice에서 index의 value가 3인 index+1값을 찾아낸다(주사위 숫자)
          : Math.pow((10 * (dice.indexOf(3) + 1) + (dice.indexOf(1) + 1)), 2)
      );
    case 3:
      rmDup = rmDup.filter((v) => v !== dice.indexOf(2) + 1);
      return rmDup[0] * rmDup[1];
    case 4:
      return rmDup.sort()[0];
  }
    
  return 0;
}

 

 

 

 

 

 

 

 

 

 

728x90

댓글