팩토리얼의 구조를 살펴보자
정수: 5가 입력이 되었을 때, 5*4*3*2*1이된다. 즉 답은 120이 나오게 된다.
정수: 459가 입력이 되었을 때는 459*458*457*....1이 답이 된다.
그럼 N이 입력 되었을때, N*(N-1)*(N-2)...로 가서
(N-1)=1이 될때까지 반복을 하게 될것이다.
이것을 해결하기 위해 하나하나 해보도록 하겠다.
1. 첫번째 조건 : 숫자를 입력받는다.
c같은 경우는 scanf();
java같은 경우는 sc.nextInt(); 를 통해 받게 될것이다.
※앞으로의 설명은 Java로 풀이 할것이다.
입력을 받아야 하기 때문에 Scanner를 사용해야한다.
import java.util.*; //보통 java.util.Scanner;를 쓰지만 *는 모든것을 사용하겠다는 의미가 되기 때문에 간편하다.
(생략)....(String[] args){ //기본 구조안에 작성해야한다.
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
}
스캐너 인스턴스를 생성하고, num이라는 변수안에 int형을 사용자에게 받았다.
2. 두번째 조건: 입력받은 만큼 -1을 하면서 곱셈을 해야한다.
for문으로 작성시 여기서 두가지 경우가 나온다.
-입력받은수 -1씩하여 계산하기.
-입력받은수까지 +1을 하여 계산하기.
//입력받은수 -1씩하여 계산
for(int i=num;i>=1;i--){
}
3. 세번째 조건: 계산한 값을 담을 변수를 준비해야한다.
계산이 되었을때, 해당 값을 저장할 변수를 만들어야한다.
해당 변수를 초기화해야하는데, 0일때는 for문안에서 계산이 안되기 때문에 1로 초기화한다.
int result=1;
for(int i=num;i>=1;i--){
result *= i; //이 부분이 추가된것 이다.
}
4. 네번째 조건: 최종 값을 출력한다.
system.out.println(result);
끝이다. 그럼 위에서 설명한 다른 방법인 입력받은 값에서 점차 +1을 하여 계산하는 방법 또한 비슷하다.
조건이 바뀌는 것이기 때문에 2번만 바꿔주면된다.
2. 두번째 조건: 입력받은 만큼 +1을 하면서 곱셈을 해야한다.
//입력받은수 +1씩하여 계산
for(int i=1;i<=num;i++){
}
이 안에는 위와 똑같이 result *= i; 가들어갈 것이고, 출력 또한 같을 것이다.
다른 방법인 재귀함수를 이용해 코드를 작성해보겠다.
재귀함수는 같은 일에 반복 작업을 할때 쓰인다.
즉, 자기자신을 호출하여 같은 일을 반복하는것이다.
그럼 아까와 같이
1. 입력 및 변수를 선언
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int result = 0; //여기서 0인 이유는 result를 가지고 계산을 하지 않기 때문에 0으로 초기화 하였다.
2. 재귀함수 호출
result = 자신이 정한 함수명(num);
3. 재귀함수 선언
public static int 자신이 정한 함수명(int num){
}
4. 재귀함수 구현
public static int 자신이 정한 함수명(int num){
return num*자신이 정한 함수명(num-1); //이 부분이 추가된것 이다.
}
5. 재귀함수 탈출
조건을 주지 않으면 재귀함수를 탈출하지 못한다.
if(num==1){
return 1;
}
4번과 5번을 합치면 재귀함수는
public static int 자신이 정한 함수명(int num){
if(num==1){
return 1;
}
return num*자신이 정한 함수명(num-1);
}
최종적으로 이런 모양이 나온다
6. 출력
system.out.println(result);
'알고리즘' 카테고리의 다른 글
[알고리즘/자료구조] JAVA 애너그램(Anagram) 알고리즘 문제 (코딩테스트 준비) (0) | 2023.05.03 |
---|---|
[알고리즘/자료구조] JAVA 애너그램(Anagram) 알고리즘 문제 (코딩테스트 준비) (0) | 2023.05.03 |
[알고리즘/자료구조] JAVA 애너그램(Anagram) 알고리즘 문제 (코딩테스트 준비) (0) | 2022.12.29 |
[알고리즘/자료구조] JAVA 두 수의 합 알고리즘 문제 (코딩테스트 준비) (0) | 2022.12.21 |
[알고리즘/자료구조] JAVA 중복 확인 알고리즘 문제 (코딩테스트 준비) (0) | 2022.12.20 |