새소식

Programmers Coding Test/Java

[프로그래머스 120848] Java - 코딩테스트 입문 / 팩토리얼

  • -

 

 

팩토리얼

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/120848

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

1)  문제

i팩토리얼 (i!)은 1부터 i까지 정수의 곱을 의미합니다. 
예를들어 5! = 5 * 4 * 3 * 2 * 1 = 120 입니다.
정수 n이 주어질 때 다음 조건을 만족하는 가장 큰 정수 i를 return 하도록 solution 함수를 완성해주세요.
i! ≤ n
제한사항
0 < n ≤ 3,628,800

 

 

 

2)  예시

 

 

Result Table
n result
3628800 10
7 3

 

 

 

입출력 예 #1
10! = 3,628,800입니다. n이 3628800이므로 최대 팩토리얼인 10을 return 합니다.


입출력 예 #2
3! = 6, 4! = 24입니다. n이 7이므로, 7 이하의 최대 팩토리얼인 3을 return 합니다.

 

 

 

 

 

 

3)  풀이

 

 

 

1. 클래스 선언을 해줍니다

● class Solution {

클래스명은 대문자로 시작해야하고, 정답이라는 의미로 Solution이라는 단어를 사용하였습니다.

 

 

 

 

2. 정수 n을 매개변수로 하는 solution 메소드를 선언합니다.

solution은 정수를 반환하므로 데이터타입을 int로 합니다.

●   public int solution(int n) {

 

 

 

 

3. 변수 answer와 factorial을 선언하고 초기화해줍니다.

●   int answer = 0;
     int factorial = 1;
        

 

 

 

4. 문제에서 n은 3,628,800 이하의 숫자이고, 10!이 그 값과 동일하다는 것을 알 수 있습니다.

그래서 for 반복문을 이용하여 i가 10이 될 때까지 초기값 1인 factorial에 곱해줍니다.

 

단, if 조건문으로 i를 점진적으로 곱한 factorial이 n과 같다면 i로 최종적인 결과값이 되어 for반복문을 break해주고,

그렇지 않으면 계속 반복문을 시행해주고 factorial이 n보다 커진다면 answer 값이 i-1이 되고 break 해줍니다.

    for(int i=1; i<=10; i++){
            factorial *= i;
            
            if(factorial == n){
                answer = i;
                break;
            }else if(n < factorial){
                answer = (i-1);
                break;
            }
        }
        return answer;
    }
}

 

 

 

 

 

 

 

 

 

4)  코드

 

class Solution {
    public int solution(int n) {
        int answer = 0;
        int factorial = 1;
        
        for(int i=1; i<=10; i++){
            factorial *= i;
            
            if(factorial == n){
                answer = i;
                break;
            }else if(n < factorial){
                answer = (i-1);
                break;
            }
        }
        return answer;
    }
}

 

 

 

 

 

 

 

5)  느낀점

이전에 팩토리얼 문제를 풀어서 factorial을 클래스 내 메소드로 푸는 방법을 했다가,

factorial이 n일 때의 조건을 생각하고 코드를 수정하다보니 현재의 코드에 도달하였습니다.

 

 

아래는 제일 처음 작성한 코드입니다. 이 코드의 경우 return i-1 부분이 개인적으로 이해가 되지 않아 다른 풀이방식을 취하기로 결심했습니다.

class Solution {
    public int solution(int n) {
        int i = 1;
        while (factorial(i) <= n) {
            i++;
        }
        return i - 1;
    }
    
    private long factorial(int x) {
        long result = 1;
        for (int i = 2; i <= x; i++) {
            result *= i;
        }
        return result;
    }
}

 

 

그리고 아래는 다른 사람이 작성한 while을 이용한 코드입니다.

class Solution {
    public int solution(int n) {
        int factorial = 1;
        int i = 0;

        while(true){
            if(factorial <= n){
                factorial *= i + 1;
                i++;
            }else break;
        }

        return i-1;
    }
}

 

 

 

 

 

 

 

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.