꺾이지 않는 마음

[프로그래머스] Lv.0 구슬을 나누는 경우의 수 JS 풀이 본문

코딩테스트 기록

[프로그래머스] Lv.0 구슬을 나누는 경우의 수 JS 풀이

중요한 것은 2022. 11. 1. 02:11

🧡문제 설명

머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수 balls와 친구들에게 나누어 줄 구슬 개수 share이 매개변수로 주어질 때, balls개의 구슬 중 share개의 구슬을 고르는 가능한 모든 경우의 수를 return 하는 solution 함수를 완성해주세요.

💛제한사항

  • 1 ≤ balls ≤ 30
  • 1 ≤ share ≤ 30
  • 구슬을 고르는 순서는 고려하지 않습니다.
  • share  balls

💚입출력 예

balls share result
3 2 3
5 3 10

💙입출력 예 설명

입출력 예 #1

  • 서로 다른 구슬 3개 중 2개를 고르는 경우의 수는 3입니다. 

입출력 예 #2

  • 서로 다른 구슬 5개 중 3개를 고르는 경우의 수는 10입니다.

Hint

  • 서로 다른 n개 중 m개를 뽑는 경우의 수 공식은 다음과 같습니다. 

✨나의 풀이

💜 factorial 함수 생성 및 BigInt() 메서드 활용

function solution(balls, share) {   
    
    const factorial = (num) => {
        let result = BigInt(1);
        
        for (num; num>=2; num--) {
            result *= BigInt(num);
        }
        
        return result;
    }
    
    return factorial(balls) / (factorial(balls-share) * factorial(share));
    
}

 

고등학교 수학 시간 때 배운 순열과 조합 공식을 알아야 풀 수 있는 문제다.

양심고백 하자면 나는 까먹어서 검색해봤다...ㅎㅎ

순열과 조합에서 사용할 팩토리얼 함수를 만든 후, 공식에 대입하였다.

 

주의할 점은 BigInt 메서드를 활용해야 한다는 것이다.

이런 팩토리얼이 들어간 문제의 경우 계산 범위가 무지막지하게 커져서 원시 자료형인 Number가 나타낼 수 있는 범위(2^53 - 1)를 초과할 수 있다. 범위를 초과하면 오류는 안나지만 제대로 된 결과값이 나오지 않으므로, BigInt 자료형을 써줘야 한다.

 

BigInt 자료형은 정수 리터럴 뒤에 n을 붙이거나, 함수 BigInt()를 호출해 생성할 수 있다.

 

그리고 BigInt 자료형과 Number 자료형을 덧셈하면 타입에러 메시지가 뜨기 때문에 계산식의 모든 숫자를 BigInt 자료형으로 바꾸어주어야 한다.

 

그나저나 factorial 활용하는 문제가 많은 거 같다. 기억해둬야겠다

 

 

😮다른 풀이

const 팩토리얼 = (num) => num === 0 ? 1 : num * 팩토리얼(num - 1)

function solution(balls, share) {
  return Math.round(팩토리얼(balls) / 팩토리얼(balls - share) / 팩토리얼(share))
}

 

재귀함수를 활용한 풀이법이다.

재귀함수 보단 for 반복문이 아직 더 편한 나에겐 정말 창의적인 답안이라고 느껴진다 ㅠㅠ

그래도 이런 것들 보일 때마다 놓치지 않고 계속해서 봐두면 언젠간 늘겠지!! 

 

Comments