본문 바로가기
Research/problems

프로그래머스_lv0_구슬을 나누는 경우의 수

by RIEM 2022. 11. 26.

문제

생각

해결

나의 해결

 

while문으로 0이 될때까지의 수를 곱해주는 방식으로 취했다.

function solution(balls, share) {
    
    function getPossible(input) {
        let result = 1
        while(input) {
            result *= input;
            input--;
        }
        return result
    }
    
	const allPossibles = getPossible(balls) / ((getPossible(balls - share)) * getPossible(share))
    
	return Math.round(allPossibles)
}

console.log(solution(30, 15))

 

다른 사람 풀이

다른 사람 풀이를 보니 이를 재귀함수로 사용할 수 있음을 알았다.

const factorial = (num) => num === 0? 일 경우, 1을 반환하고 그렇지 않을 경우

num에 팩토리얼(num-1)을 다시 곱하라는 의미다. 

 

만약 5를 팩토리얼 한다면, 

5 * factorical(4)

5 * 4 * factorical(3)

5 * 4 * 3 * factorical(2)

5 * 4 * 3 * 2 * factorical(1)

5 * 4 * 3 * 2 * 1 * factorical(0)

5 * 4 * 3 * 2 * 1 * 1

이런 방식으로 처리가 될 것이다. 마지막에는 0이 아니라 1로 끝나는 이유는 처음에 num===0?가 참일 경우 1로 지정하라는 ternary operator 조건을 만들어주었는데, 이는 0을 곱하면 앞에 어떤 수가 곱해졌더라도 최종 값이 0이 되기 때문이다.

회고

처음에는 Math.round 없이 제출했는데, 몇 개의 테스트에서 계속 막히는 것을 확인했다. 알고보니 특정 값을 대입할 경우 소수의 결과값이 나온다는 조언 댓글을 보고 Math.round를 적용하니 문제없이 통과했다.

 

문제를 풀다보니 몇몇의 테스트 케이스들로 인해 통과를 못하는 상황이 종종 발생하기 시작하는 것을 느낀다. 

문제 발생 가능성을 고려하는 것은 개발자의 기본적인 소양이라고 생각하는데, 문제 풀이에 급급하지 않고 세부적인 디테일까지 고려를 해서 문제를 풀이해야겠다는 생각이 들었다. 

이를 위해 문제를 풀 때 내 나름의 테스트 케이스를 개발하면 어떨까라는 생각을 했다. 만약 정수를 리턴해야하는 함수를 만드는 문제의 경우 반복문으로 순차적으로 또는 랜덤으로 테스트 값들을 만들 수 있을 것 같다는 생각이 든다.



오랜만에 factorial을 보니 반갑다. 이번 문제는 나이브한 접근 방식으로 풀었는데, 다음번에는 factorial로 푸는 방법을 생각해봐야 겠다.

레퍼런스

https://school.programmers.co.kr/learn/courses/30/lessons/120840/solution_groups?language=javascript

 

댓글