intro : 팩토리얼은 주어진 N부터 N-1, N-2 … 1 까지의 곱을 뜻한다.
문제
0보다 크거나 같은 정수 N이 주어진다. 이때, N!을 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 정수 N(0 ≤ N ≤ 12)이 주어진다.
출력
첫째 줄에 N!을 출력한다.
문제 풀이1 (while문 이용 104ms)
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
// 입출력을 위한 BufferedReader, BufferedWriter 객체 생성
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// br을 통해 읽은 값 정수로 변환
int input = Integer.parseInt(br.readLine());
// 결과값 1로 설정
// 예제에서 입력값이0인 경우 출력값이1 참고
int result = 1;
// while문을 통해 입력값이 0보다 클때만 조건이 참
while (input > 0) {
// 입력값은 반복적으로 곱하기 계산을 수행
result *= input;
// input = input - 1
input--;
}
// bw로 출력하기 위해 문자열로 변환 후 write
bw.write(String.valueOf(result));
bw.flush();
// 자원 반납
bw.close();
br.close();
}
}
문제 풀이2 (재귀함수 이용 104ms)
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
// 입출력을 위한 BufferedReader, BufferedWriter 객체 생성
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// br을 통해 읽은 값 정수로 변환
int input = Integer.parseInt(br.readLine());
// factorial 재귀함수를 통해 결과값 계산
int result = factorial(input);
// bw로 출력하기 위해 문자열로 변환 후 write
bw.write(String.valueOf(result));
bw.flush();
// 자원 반납
bw.close();
br.close();
}
public static int factorial(int n) {
// 입력값이 0,1 경우는 무조건 1 반환
if (n == 0 || n == 1) return 1;
// 재귀함수를 호출하기위해 return 문에서 다시 factorial에 N-1값을 호출
return n * factorial(n - 1);
}
}
문제 해석
위 문제는 문제 해석의 여지없이 팩토리얼을 계산하는 문제이다. 팩토리얼에 개념에 대해서 짚어보면, 10!
을 계산 결과는 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 이다. 수식을 만들어보면, N * N-1 * N-2 * …. 1 까지의 곱이다. 정리하자면 N 부터 1까지 -1씩 한 값들의 곱을 계산결과로 만들면 된다.
위 방식에 대한 문제풀이는 2가지로 나눠서 풀 수 있는데 첫번째는 while문을 이용해 문제를 푸는 방법이 있고 두번째는 재귀함수를 이용해 문제를 푸는 방법이 있는데, 재귀함수는 디버깅이 어려우니 풀이방법만 확인하고 보통 while문을 통해 푸는걸 추천한다.
재귀함수는 문제가 발생했을때 디버깅을 통해 어느 부분이 문제인지 판별하기 너무 어렵다.