티스토리 뷰
Solved.ac Class 완전정복 프로젝트
Class : 2 ~ 2 ++
링크
https://www.acmicpc.net/problem/1676
1676번: 팩토리얼 0의 개수
N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
문제
N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. (0 ≤ N ≤ 500)
출력
첫째 줄에 구한 0의 개수를 출력한다.
접근방법
팩토리얼 값을 계산했을 때 나오는 0의 개수를 출력하는 문제이다. 0의 개수를 어떻게 구해야할지 생각해보는 것이 핵심이다. 이 점을 인지하고 풀이로 들어가자.
풀이
결과값에서 0이 어떻게 생기는가 생각해보자. 팩토리얼은 모두 곱의 관계를 가지고 있으므로, 10이 들어갈 때마다 0이 하나씩 추가된다. 그 말을 정리하면, 2와 5가 한쌍일 때 마다 0이 하나 추가된다. 10! 은 2, 5 ,10 (2*5)숫자를 가지고 잇으므로 0의 갯수 2개 가 된다.
이러한 점을 이용하여, 나는 팩토리얼에 사용된 2와 5의 총 갯수를 구하고, 그로인해 만들어 질 수 있는 0의 개수를 구했다. N!이 주어졌을 때 0 개수를 구하는 법은 아래와 같다.
- N 보다 작은 모든 2의 제곱수로 나누고, 그 합을 저장한다.
- N 보다 작은 모든 5의 제곱수로 나누고, 그 합을 저장한다.
- 두 개중 최솟값을 반환한다.
최솟값을 반환하는 이유는 10을 만드려면 두 숫자 중 적은 갯수를 가진 쪽에 맞춰야하기 때문이다.
코드
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Main test = new Main();
}
public Main() {
Scanner sc = new Scanner(System.in);
int fac = sc.nextInt();
System.out.println(solution(fac));
}
private int solution (int factorial){
int cnt_2 =0;
int cnt_5 = 0;
//2의 9제곱은 512 이므로, N 최대값인 500보다 큼
for (int i = 1 ; i < 9 ; i++){
cnt_2+= factorial/ Math.pow(2,i);
cnt_5+= factorial/Math.pow(5,i);
}
int result = Math.min(cnt_2,cnt_5);
return result;
}
}
2와 5중 2가 작으므로, 작은 쪽을 기준으로 N의 최대값 보다 작은 제곱수 까지만 검사한다. 이렇게 하면, 팩토리얼을 구하지 않고도 쉽게 찾아낼 수 있다.
결과
포스팅에 문제가 있거나, 설명이 잘못된 부분 지적 환영합니다.
더 나은 퀄리티의 콘텐츠를 제공할 수 있도록 노력하겠습니다.
읽어주셔서 감사합니다.
'공부 > 코딩 테스트 준비' 카테고리의 다른 글
[백준] 18870 - 좌표압축 JAVA (0) | 2021.09.18 |
---|---|
[백준] 1931 - 회의실 배정 JAVA (0) | 2021.09.17 |
[백준] 1780 - 종이의 개수 JAVA (0) | 2021.09.15 |
[백준] 7576 - 토마토 JAVA (0) | 2021.09.15 |
[백준] 1389 - 케빈 베이컨의 6단계 법칙 JAVA (0) | 2021.09.13 |
- Total
- Today
- Yesterday
- value annotation
- JNDI연동
- java
- dml
- 아기상어나쁜상어
- looker instance 접속
- 플루이드 와샬
- DP
- 파이썬
- 유클리드-호제법
- DFS
- looker core
- 재귀
- 9019
- 프로그래머스
- 그래프 탐색
- 프로그래머스 문제정복
- 하루 회고
- Spring
- Python
- 아기상어미워
- 자바
- 코딩테스트
- Database
- 브루트포스
- 백준
- BFS
- 카카오
- db
- 실패일기
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |