Study with me/프로그래머스 L0 마스터하기
프로그래머스 - L0 구슬을나누는경우의수
외계나무
2024. 4. 20. 14:18
프로그래머스 - level 0 구슬을 나누는 경우의 수
주어진 테스트 케이스는 다 맞았는데 또다시... 34.3% 맞았다. 심지어 3개는 런타임 에러 났음 ㅋㅋㅋㅋ...
팩토리얼을 구현하는 재귀는 일단 보류
class Solution {
public int solution(int balls, int share) {
int answer = fac(balls) / (fac(balls-share) * fac(share));
return answer;
}
int fac(int num) {
if(num==1)
return 1;
return fac(num-1)*num;
}
}
연산 개수를 줄여보았다.
이번에는 런타임 에러는 안 났는데 정답률은 48.6%...
class Solution {
public int solution(int balls, int share) {
int answer = 1;
for(int i=balls; i>(balls-share); i--) {
answer*=i;
}
for(int i=2; i<=share; i++) {
answer/=i;
}
return answer;
}
}
정수 범위를 넘어서 그런 거였다. ㅎ... BigInteger 사용해서 해결.
import java.math.BigInteger;
class Solution {
public int solution(int balls, int share) {
BigInteger answer = new BigInteger("1");
for(int i=balls; i>(balls-share); i--) {
answer = answer.multiply(BigInteger.valueOf(i));
}
for(int i=2; i<=share; i++) {
answer = answer.divide(BigInteger.valueOf(i));
}
return answer.intValue();
}
}
타인의 풀이 중 멋진 풀이가 있어서 가져와봤다... 조합의 성질을 이용한 재귀
class Solution {
public long solution(int balls, int share) {
share = Math.min(balls - share, share);
if (share == 0)
return 1;
long result = solution(balls - 1, share - 1);
result *= balls;
result /= share;
return result;
}
}
balls부터 balls-share+1까지 순서대로 곱하면서 동시에
share부터 1까지 순서대로 나누는 방식
for문으로도 만들 수 있을 것 같긴한데, 재귀를 잘 활용한 것 같음.