코딩테스트
[Programmers] 구슬을 나누는 경우의 수 (팩토리얼 / 재귀함수X)
주니어주니
2023. 7. 27. 17:58
class Solution {
public int solution(int balls, int share) {
return factorial(balls) / (factorial(balls - share) * factorial(share));
}
private int factorial(int num) {
if (num == 1) return 1;
return num * factorial(num - 1);
}
}
팩토리얼 -> 재귀함수로 푸는 문제라 생각하고 아 문제 잘풀었다 하고 제출했는데 와다다 실패
-> 재귀 범위 넘어감
40 몇점
class Solution {
public long solution(int balls, int share) {
return factorial(balls) / (factorial(balls - share) * factorial(share));
}
private long factorial(int num) {
long fac = 1;
for(int i=1; i<=num; i++) {
fac *= i;
}
return fac;
}
}
재귀함수 없이 팩토리얼 구현 + long 변수에 담기
60 몇점
class Solution {
public int solution(int balls, int share) {
long ans = 1;
for(int i = share + 1; i <= balls; i++)
ans *= i;
for(int i = 1; i <= (balls - share); i++)
ans /= i;
return (int)ans;
}
}
아예 약분해서 풀기
-> 오버플로우 발생할 수 있음 + long 넘어갈 수 있음
88점
class Solution {
public int solution(int balls, int share) {
long ans = 1;
int rest = 1;
for(int i = share + 1; i <= balls; i++) {
ans *= i;
ans /= rest;
rest ++;
}
return (int)ans;
}
}
곱셈과 나눗셈 반복 -> 크기 작아짐
통과 ㅠ