본문 바로가기
개발/[백준] 브론즈 마스터하기

백준 10872번 팩토리얼 _ java

by 쑨토리 2023. 1. 30.
반응형

https://www.acmicpc.net/problem/10872

 

10872번: 팩토리얼

0보다 크거나 같은 정수 N이 주어진다. 이때, N!을 출력하는 프로그램을 작성하시오.

www.acmicpc.net


 

 

💡 풀이

import java.util.Scanner;
 
public class Main {
 
	public static void main(String[] args) {
 
		Scanner in = new Scanner(System.in);
		
		int N = in.nextInt();
		in.close();
		
		int sum = factorial(N);
		System.out.println(sum);
		
	}
	
	public static int factorial(int N) {
		if(N <= 1) return 1;	// 재귀 종료조건
		return N * factorial(N - 1);		
	}
 
}

 

*참고*
0!은 1이다!
0!의 값이 0인줄 알았는데, 이번 문제를 풀면서 0!이 1이라는 것을 알게 되었다. 
그 이유는, !(펙토리얼)은 경우의 수를 나타내는 것이라는 점.
n! = (1부터 n까지의 수로 만들 수 있는 경우의 수)이다. 
이때, 0! = (1~0까지의 수로 만들 수 있는 경우의 수)가 되므로 0!은 1이 된다고 보면 쉽게 이해가 될것이다.

 

N 이 1또는 0이 될때는 return 1을 해주고, 그 외는 N * factorial(N-1); 을 해서 재귀를 구성했다. 

 

 

사실 아직 재귀가 이해가 안되서 블로그를 보고 코드를 짰는데, factorial 함수가 연산되는 방법은 아래와 같다. 

// return N * factorial(N - 1);
 
6 * factorial(5){
	5 * factorial(4){
		4 * factorial(3){
			3 * factorial(2){
				2 * factorial(1){
					return 1;
				}
				return 2 * 1;
			}
			return 3 * 2 * 1;
		}
		return 4 * 3 * 2 * 1;
	}
	return 5 * 4 * 3 * 2 * 1;			
}
return 6 * 5 * 4 * 3 * 2 * 1;
🚨 
N 의 범위가 0 ~ 12 이기 때문에 int 로도 가능하지만, 
13 을 넘어가면 13! = 6227020800 으로 int 형의 범위를 벗어나기 때문에 long 타입으로 해주어야 한다.
 
이렇게 입력받는 범위를 잘 보고 풀어야한다.

 

 

 

아래 블로그 코드를 보고 공부, 포스팅을 했습니다. 


https://st-lab.tistory.com/93

 

[백준] 10872번 : 팩토리얼 - JAVA [자바]

www.acmicpc.net/problem/10872 10872번: 팩토리얼 0보다 크거나 같은 정수 N이 주어진다. 이때, N!을 출력하는 프로그램을 작성하시오. www.acmicpc.net 문제 재귀에 대한 문제를 처음 접할 때 가장 먼저 접하는

st-lab.tistory.com