Algorithm

N!에서 0의 개수

욜스터 2021. 1. 22. 17:22
728x90

▣ 문제

- 자연수 N이 입력되면 N! 값에서 일의 자리부터 연속적으로 ‘0’이 몇 개 있는지 구하는 프로그 램을 작성하세요. 만약 5! = 5 ×4 × 3 × 2 ×1 = 120으로 일의자리부터 연속적된 ‘0’의 개수는 1입니다. 만약 12! = 479001600으로 일의자리부터 연속적된 ‘0’의 개수는 2입니다.

 

▣ 입력설명

- 첫 줄에 자연수 N(10<=N<=1,000)이 입력된다.

 

▣ 출력설명

- 일의 자리부터 연속된 0의 개수를 출력합니다.

 

▣ 입력 예시

12


▣ 출력 예시

2

 

 

-내 코드

#include <stdio.h>

int main()
{
    int N;
    int fac=1;
    scanf("%d", &N);
    
    for(int i = 1; i <=N; i++){
        fac *= i;
    }
    
    int now = fac;
    int zeros = 0;
    int max = 0;
    while(1){
        if(now%10==0){
            zeros++;
            if(zeros > max) max=zeros;
        }
        else zeros = 0;
        now /=10;
        if(now==0) break;
    }
    
    printf("%d", max);

    return 0;
}

결과는 잘 나오나 시간복잡도면에서 효율적이지 않다.

 

 

새로운 접근방법

N!의 결과값에 0이 있다는 뜻은 10 또는 2와 5로 나눌 수 있다는 것으로 해석할 수 있다.

소인수분해를 했을 시, 2와 5의 개수를 비교하고 더 적은 수를 출력하면 된다. 

 

120! = 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 2*2*3 * 11 * 2*5 * 3*3 * 2*2*2 * 7 * 2*3 * 5 * 2*2 * 3 * 2

2 개수: 10개, 5 개수: 2개

따라서 2이다. 

 

-고친 코드 

#include <stdio.h>

int main()
{
    int N;
    int twos=0;
    int fives=0;
    scanf("%d", &N);
    for(int i = 2; i <=N; i++){
        int num = i;
        int j = 2;
        while(num!=1){
            if(num%j==0){
                if(j==2) twos++;
                else if(j==5) fives++;
                num/=j;
                j=2;
            }
            else j++;
        }
    }
    if(twos > fives) printf("%d", fives);
    else printf("%d", twos);

    return 0;
}
728x90
반응형

'Algorithm' 카테고리의 다른 글

영지 선택(2차원 배열 구간합, DP)  (0) 2021.02.03
이분검색  (0) 2021.01.29
[개념] 정렬 알고리즘  (0) 2021.01.25
[개념] 탐색(검색) 알고리즘  (0) 2021.01.25
N!의 표현법  (0) 2021.01.18