문제
0보다 크거나 같은 정수 N이 주어진다. 이때, N!을 출력하는 프로그램을 작성하시오.
입력 조건
첫째 줄에 정수 N(0 ≤ N ≤ 12)이 주어진다.
출력 조건
첫째 줄에 N!을 출력한다.
풀이
고등학교 이후로 팩토리얼을 처음 마주해서 아무생각 없이 N! 에서 !가 그냥 느낌표인줄 알았다.
예제 입력을 안보고 했으면 못풀었을지도 모른다.
10! = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 인건 알겠는데 0은 왜 1이 되는건가 했는데 다음과 같은 이유가 있었다.
0 팩토리얼(0!)이 1이 되는 이유는 수학적인 정의와 관련이 있습니다. 팩토리얼 함수는 양의 정수 n에 대해 1부터 n까지의 모든 정수의 곱을 나타냅니다. 예를 들어, 5!은 5 * 4 * 3 * 2 * 1을 의미합니다. 그러나 이 정의가 0에 적용되는 경우에는 어떻게 될까요? 0 팩토리얼이 "0부터 0까지의 모든 정수의 곱"이라고 정의하면 결과는 0이 될 것입니다. 하지만, 이렇게 되면 팩토리얼 함수의 일관성이 깨집니다. 그래서 수학자들은 0 팩토리얼을 1로 정의하여 팩토리얼 함수의 일관성을 유지했습니다. 또한, 이러한 정의는 조합론에서 중요한 역할을 합니다. 예를 들어, n개의 요소 중에서 0개를 선택하는 방법은 딱 한 가지이므로, nC0 = n!/0!(n-0)! = 1이 되어야 합니다. 만약 0!이 0이라면, 이 수식이 성립하지 않습니다. 따라서, 0! = 1은 팩토리얼 함수의 일관성을 유지하고, 조합론에서의 이론을 지지하기 위해 수학적으로 정의된 것입니다.
이러한 이유로 0!은 1로 정의를 한다고 한다. (이게 뭐람?)
결론은 N이라는 숫자를 넣었을 때 1부터 N까지를 곱을 연산해주는 코드를 만들라는 뜻 같다.
다행히도 N(0 ≤ N ≤ 12) 0~12까지만 출력시키면 된다.
팩토리얼 메서드라는게 있나해서 찾아보았는데 신기할 것도 없이 웬만한건 메서드로 전부 존재하는거 같다.
factorial 메서드는 양의 정수 n에 대해 1부터 n까지의 모든 정수를 곱하는 연산을 수행하는 함수입니다.
public static int factorial(int N) {
if (N <= 1)
return 1;
else
return N * factorial(N-1);
}
이게 팩토리얼 메서드의 기본틀이라고 한다.
1까지는 N에 0을 넣든 1을 넣든 1이 출력되기 때문에 저렇게 구분지어둔 것 같다.
아래는 원래라면 기본값이 있지만 내 입력값을 받아서 처리를 해야되기 때문에 저렇게 사용하는듯 싶다.
이런 식으로 사용하는 것을 재귀 함수라고 하는데 중학교인가 고등학교에서 배웠던 기억이 흐릿하게 나긴 나는데... 기억이 잘 안난다.
재귀 함수란 함수 내부에서 자기 자신을 다시 호출하는 함수를 말합니다. 이렇게 함수가 자기 자신을 호출하면서 같은 문제의 더 작은 부분 문제를 해결해 나가는 방식으로 작동합니다. 예를 들어, 팩토리얼 함수는 재귀 함수로 구현할 수 있습니다. 팩토리얼 n!은 n * (n-1)!로 정의할 수 있는데, 이때 (n-1)! 계산을 위해 같은 팩토리얼 함수를 다시 호출하게 됩니다. 이런 방식으로 함수가 자기 자신을 호출하면서 최종적으로 문제를 해결하게 되는데, 이것이 재귀 함수의 기본 원리입니다. 재귀 함수는 구현이 간결하고 이해하기 쉬운 경우가 많지만, 잘못 사용하면 무한 루프에 빠지거나 스택 오버플로우와 같은 문제가 발생할 수 있습니다. 따라서 재귀 함수를 작성할 때는 반드시 종료 조건을 설정해야 합니다. 이는 재귀 호출이 무한히 반복되는 것을 방지하는 역할을 합니다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
scanner.close();
System.out.println(factorial(N));
}
public static int factorial(int N) {
if (N <= 1) return 1;
else return N * factorial(N-1);
}
}
예제와 동일하게 나온다.
백준에서도 통과했다.
정리
결국은 팩토리얼 메소드에 대해서 알고 있냐는 그런 문제인데 난 몰라서 찾아본거라 내가 푼게 맞다고 할지...
수학관련된건 웬만하면 전부 메서드로 존재하고 있는 것 같다.
'Knowledge > Algorithm' 카테고리의 다른 글
[2480/JAVA] 주사위 세개 (0) | 2024.01.02 |
---|---|
[2438/JAVA] 별 찍기 - 1 (0) | 2023.12.30 |
[10951/JAVA] A+B - 4 (0) | 2023.12.23 |
[2420/JAVA] 사파리월드 (1) | 2023.12.22 |
[2753/JAVA] 윤년 (0) | 2023.12.21 |
쓰임 있는 사람이 되기 위해 노력 중입니다.