[js] 주사위 게임 2 (lv.0)

sookyoung.k·2024년 6월 3일
post-thumbnail

1부터 6까지 숫자가 적힌 주사위가 세 개 있습니다. 세 주사위를 굴렸을 때 나온 숫자를 각각 a, b, c라고 했을 때 얻는 점수는 다음과 같습니다.

  • 세 숫자가 모두 다르다면 a + b + c 점을 얻습니다.
  • 세 숫자 중 어느 두 숫자는 같고 나머지 다른 숫자는 다르다면 (a + b + c) × (a2 + b2 + c2 )점을 얻습니다.
  • 세 숫자가 모두 같다면 (a + b + c) × (a2 + b2 + c2 ) × (a3 + b3 + c3 )점을 얻습니다.

세 정수 a, b, c가 매개변수로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.

제한사항

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

나의 풀이

function solution(a, b, c) {
    let pow2 = (a, b, c) => {
        return Math.pow(a, 2) + Math.pow(b, 2) + Math.pow(c, 2);
    };
    let pow3 = (a, b, c) => {
        return Math.pow(a, 3) + Math.pow(b, 3) + Math.pow(c, 3);
    };
    
    let answer = 0;
    if(a == b && b == c) {
        answer = (a+b+c) * pow2(a, b, c) * pow3(a, b,c);
    } else if (a == b || a == c || b == c) {
        answer = (a+b+c) * pow2(a, b, c);
    } else {
        answer = a + b + c;
    }
    return answer;
}
  • pow2() 함수 = 세 수의 제곱을 합하는 함수

  • pow3() 함수 = 세 수의 세 제곱을 합하는 함수

  • 첫 번째 if문 - a, b, c가 모두 같을 경우

  • 두 번째 if문 - 두 개만 같을 경우

  • 세 번째 if문 - 모두 다를 경우

뭔가... 일단 문제 그대로를 보고 정말 정직하게 푼 느낌.
그리고 Math.pow()를 써도 되지만, ** 연산자를 통해서 간결하게 제곱과 세제곱을 계산할 수 있다.

function solution(a, b, c) {
    const pow2 = (x) => x ** 2;
    const pow3 = (x) => x ** 3;

    const sum = a + b + c;
    const sumPow2 = pow2(a) + pow2(b) + pow2(c);
    const sumPow3 = pow3(a) + pow3(b) + pow3(c);

    if (a === b && b === c) {
        return sum * sumPow2 * sumPow3;
    } else if (a === b || a === c || b === c) {
        return sum * sumPow2;
    } else {
        return sum;
    }
}

코드를 조금 간결하게 만들면 이렇게 된다.

다른 풀이 1

const solution = (a, b, c) => {
    const set = new Set([a, b, c]);
    switch ([...set].length) {
        case 1: return calculate([a, b, c], 3);
        case 2: return calculate([a, b, c], 2);
        case 3: return calculate([a, b, c]);
    }
};

const calculate = (inc, n=1) => {
    const [a, b, c] = inc;
    let result = 1;
    for (let i = 1; i <= n; i++) {
        result *= Math.pow(a, i) + Math.pow(b, i) + Math.pow(c, i)
    }

    return result;
};
  • [a, b, c] 배열을 Set 객체로 변환하여 중복된 값을 제거한다.
  • 이를 배열로 반환한 후 그 길이에 따라 동작을 수행한다. ([...set])
    - Set의 길이가 1인 경우, 모든 값이 동일하므로 caculate() 함수에 [a, b, c]와 3을 전달한다.
    - 2인 경우, 3인 경우 각각 switch문의 case에 따라 caculate()에 다른 인자를 전달한다.
  • caculate() 함수: 배열과 선택적 매개변수 n을 받는다. n의 기본값은 1이다.
  • 배열 inc를 풀어서 [a, b, c]에 할당한다.
  • result 변수는 초기값 1로 시작한다.
  • 1부터 n까지의 반복문을 통해 각 숫자의 제곱이나 세제곱 값을 더한 후 이를 연속으로 곱한다.

다른 풀이 2

function solution(a, b, c) {
    let sum1 = a + b + c;
    let sum2 = a * a + b * b + c * c;
    let sum3 = a ** 3 + b**3 + c**3;

    if (a === b && b === c) 
        return sum1*sum2*sum3;
     else if (a === b || a === c || b === c) 
        return sum1*sum2;
     else 
        return sum1;

}
profile
영차영차 😎

0개의 댓글