[JavaScript] 프로그래머스 구슬을 나누는 경우의 수 (팩토리얼 구하기 , RangeError)

Gaeun·2022년 11월 12일
0

구슬을 나누는 경우의 수

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


나의 풀이

function solution(balls, share) {
  
  function factorial(n) {
    if (n == 0 || n == 1) {
      return 1;
    } else {
      return n * factorial(n - 1)
    }
  }
  
  if (balls === share) {
    return 1
  }
  
  return Math.round(factorial(balls) / (factorial(balls - share) * factorial(share)))
}
  1. 우선 문제 설명에 있는 Hint를 활용하여 풀기 위해 팩토리얼 값을 구하는 코드를 작성했다. 처음에는 아래와 같이 작성했었는데 자꾸만 "RangeError: Maximum call stack size exceeded"이 떴다.
function factorial(n) {
    return n * factorial(n - 1)
  }

내가 작성한 함수는 재귀함수이며, 값이 리턴될 때까지 무한 반복하기 때문에 에러가 뜬 것 같았다. 따라서 n의 값이 0 혹은 1일 때를 지정해보았고, 그 후 에러가 더이상 뜨지 않았다. 이와 관련한 에러는 조금 더 공부해보아야 할 것 같다.

  1. 이후 ballsshare값이 같을 경우 1을 반환하도록 지정해주고, 다를 경우 Hint에 있는 공식을 활용하여 코드를 마저 작성했다.

  2. 그리고 처음에는 Math.floor

다른 사람의 풀이

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

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

이 코드는 따지고 보면 내 코드와 일치한다. 하지만, 이 코드는 삼항 연산자를 사용하였으며, 내가 문제를 겪었던 n의 범위를 지정해줌으로써 에러를 처음부터 막을 수 있었다.

문제를 풀며 "RangeError: Maximum call stack size exceeded"를 겪은 것은 처음이었다. 재귀 함수를 사용할 때 범위를 지정해주어 call stack이 넘치지 않도록, 무한 반복하지 않고 빠져나올 수 있도록 코드를 작성할 때 더욱 생각해보고 작성해야겠다.😭

profile
🌱 새싹 개발자의 고군분투 코딩 일기

0개의 댓글