본문 바로가기
알고리즘 문제 풀이/백준

백준 팩토리얼 0의 개수 Kotlin (1676)

by 옹구스투스 2022. 7. 19.
반응형

문제 출처 : https://www.acmicpc.net/problem/1676

 

1676번: 팩토리얼 0의 개수

N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

문제

N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. (0 ≤ N ≤ 500)

출력

첫째 줄에 구한 0의 개수를 출력한다.

알고리즘 분류

풀이

수학적으로 접근할 수 있다.

우선 N!은 1*2*3*4*5*...*N이다.

분명 다 곱해보지 않더라도 0의 개수를 알 수 있을 거라는 생각이 든다.

본인은 우선 10이나 100이나 1000을 곱한다면 무조건 0의 개수가 늘어남을 알 수 있다.

또, 5와 짝수가 곱해지는 경우 0의 개수가 늘어나는 것을 알 수 있다.

그래서 접근한 방법으로는 어떤 수 x에 1*2*3*4를 곱하고 여기에 5를 곱하면 무조건 마지막 수는 0이 된다.

또 어떤 수 x에 6*7*8*9를 곱하고 10을 곱하면 무조건 마지막 수는 0이 된다.

이를 좀 간단히 표현하면 1*2*3*4에 2가 포함되어있고, 6*7*8*9에도 2가 포함되어있다. 여기에 5를 곱하는 경우가 0이 늘어나는 경우라고 생각한다면 2*5의 셋트가 등장할 때마다 0이 늘어난다고 볼 수 있다.

결론적으로 우리는 N!에서 2*5의 셋트의 수를 구해야 한다.

소인수분해해 보면 2보다 5의 수가 더 적을 수밖에 없다.

따라서 2*5의 셋트는 5가 나온 개수와 같다.

여기서 주의할 점은 만약 N!에서 N이 26이상이면 중간에 25가 곱해진다.

25는 5^2으로 5가 두 번 곱해지기 때문에 이를 한 번으로 세는 게 아닌 2개로 세어야 한다.

125는 마찬가지로 5^3으로 세야 한다.

따라서 식은 주어진 N!에 대해서 N에 들어있는 5의 개수, N에 들어있는 25의 개수, N에 들어있는 125의 개수를 더해주면 된다.

 

코드

val br = System.`in`.bufferedReader()
fun getInt() = br.readLine().toInt()

fun main() = with(System.out.bufferedWriter()) {
    val n = getInt()
    var key = 5
    var answer = 0
    while (key <= n) {
        answer += n / key
        key *= 5
    }
    write("$answer")
    close()
}
반응형

댓글