[Lv.0] 주사위 게임 3

woodstock·2024년 1월 22일
0

코딩테스트

목록 보기
34/56
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 함수를 작성하는 문제이다.

풀이

function countDice(a, b, c, d) {
  let counts = {};
  [a, b, c, d].forEach(num => {
    counts[num] = (counts[num] || 0) + 1;
  });
  return counts;
}

function solution(a, b, c, d) {
  let counts = countDice(a, b, c, d);
  let keys = Object.keys(counts);
  
  switch (keys.length) {
    case 1:
      return 1111 * keys[0];
    
    case 2:
      let [first, second] = keys.map(Number);
      if (counts[first] === 2 && counts[second] === 2) {
    	  return (first + second) * Math.abs(first - second);
  	  } else {
        let p = counts[first] === 3 ? first : second;
        let q = counts[first] === 1 ? first : second;
        return Math.pow(10 * p + q, 2);
      }
    
    case 3:
      let doubleNum = keys.find(key => counts[key] === 2);
      let product = keys.reduce((prod, key) => prod * (key !== doubleNum ? Number(key) : 1), 1);
      return product;
      
    default:
      return Math.min(a, b, c, d);
  }
}

풀이해설

// 각 숫자가 몇 번 나왔는지 세어 객체로 반환하는 함수
function countDice(a, b, c, d) {
  let counts = {};
  [a, b, c, d].forEach(num => {
    counts[num] = (counts[num] || 0) + 1;
  });
  return counts;
}

// 주사위 게임 함수
function solution(a, b, c, d) {
  let counts = countDice(a, b, c, d);
  let keys = Object.keys(counts);
  
  switch (keys.length) {
    case 1:
      // 모든 주사위가 같은 숫자
      return 1111 * keys[0];
    
    case 2:
      // 두 쌍의 주사위가 같은 숫자 또는 세 개가 같은 숫자
      let [first, second] = keys.map(Number);
      if (counts[first] === 2 && counts[second] === 2) {
    // 두 쌍의 주사위가 각각 같은 숫자
    return (first + second) * Math.abs(first - second);
  } else {
    // 세 개가 같은 숫자
    let p = counts[first] === 3 ? first : second;
    let q = counts[first] === 1 ? first : second;
    return Math.pow(10 * p + q, 2);
  }
    
    case 3:
      // 한 쌍의 주사위가 같은 숫자
      let doubleNum = keys.find(key => counts[key] === 2);
      let product = keys.reduce((prod, key) => prod * (key !== doubleNum ? Number(key) : 1), 1);
      return product;
      
    default:
      // 모든 숫자가 다름
      return Math.min(a, b, c, d);
  }
}
profile
해내는 사람

0개의 댓글