문제 출처 : https://www.acmicpc.net/problem/1676
문제
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()
}
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
백준 14238 출근 기록 Kotlin (dp) (0) | 2022.07.21 |
---|---|
백준 11687 팩토리얼 0의 개수 Kotlin (수학) (0) | 2022.07.20 |
백준 12969 ABC Kotlin (dp) (0) | 2022.07.18 |
백준 14503 로봇 청소기 Kotlin (시뮬레이션) (0) | 2022.07.17 |
백준 1301 비즈 공예 Kotlin (dp) (0) | 2022.07.16 |
댓글