백준 11687[자바] java 팩토리얼 0의 개수
문제 링크:https://www.acmicpc.net/problem/11687
▶문제
가장 끝의 0의 개수가 M개인 N! 중에서 가장 작은 N을 찾는 프로그램을 작성하시오.
▶입력
첫째 줄에 M (1 ≤ M ≤ 100,000,000)이 주어진다.
▶출력
가장 끝의 0의 개수가 M개인 N! 중에서 가장 작은 N을 출력한다. 그러한 N이 없는 경우에는 -1을 출력한다.
▶해설
M의 크기가 1억이므로 이분 탐색을 활용해서 탐색해야 합니다. 이때 0이 만들어지는 조건을 생각하면 됩니다.
0이 만들어지는 조건은 2*5가 존재할 때입니다. 이때 2는 2의 배수마다 생성되므로 5의 개수보다 항상 많습니다.
따라서 5의 개수에 따라 0의 개수가 결정됩니다. 그렇다면 55일 때 5의 개수가 몇 개인지 파악하는 방법은 쉽습니다.
5의 거듭제곱들로 나누었을 때 의 몫들입니다. 따라서 아래와 같은 식을 구할 수 있습니다.
private static int solve(int mid){
int count=0;
for(int i=5; i<=mid; i*=5){
count+=(mid/i);
}
return count;
}
이제 이분탐색의 범위를 지정합니다. left는 1이고, right는 m*5로 진행해줍니다. m과 5의 개수가 연관성이 있기 때문입니다. 이때 주의할 점은 m과 정확하게 같은 개수가 존재하는지 체크하고 없을 경우 -1을 출력하기 위해 check 불린 값을 사용해야 합니다.
while(left<=right){
int mid = (left+right)/2;
if(solve(mid)>m){
right=mid-1;
} else if(solve(mid)==m){
right=mid-1;
check=true;
}
else{
left = mid+1;
}
}
전체 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.*;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int m = Integer.parseInt(br.readLine());
int left=1;
int right=m*5;
boolean check=false;
while(left<=right){
int mid = (left+right)/2;
if(solve(mid)>m){
right=mid-1;
} else if(solve(mid)==m){
right=mid-1;
check=true;
}
else{
left = mid+1;
}
}
if(check){
System.out.println(left);
}else{
System.out.println(-1);
}
}
private static int solve(int mid){
int count=0;
for(int i=5; i<=mid; i*=5){
count+=(mid/i);
}
return count;
}
}
'Alogorithm' 카테고리의 다른 글
백준 25196[자바] java 숲속에서 새 구경하기 (1) | 2022.06.11 |
---|---|
백준 3020[자바] jav 개똥벌레 (0) | 2022.06.07 |
백준 1300[자바] java K번째 수 (0) | 2022.06.05 |
백준 13397[자바] java 구간 나누기 2 (0) | 2022.06.02 |
백준 5052[자바] java 전화번호 목록 (0) | 2022.06.01 |
댓글
이 글 공유하기
다른 글
-
백준 25196[자바] java 숲속에서 새 구경하기
백준 25196[자바] java 숲속에서 새 구경하기
2022.06.11 -
백준 3020[자바] jav 개똥벌레
백준 3020[자바] jav 개똥벌레
2022.06.07 -
백준 1300[자바] java K번째 수
백준 1300[자바] java K번째 수
2022.06.05 -
백준 13397[자바] java 구간 나누기 2
백준 13397[자바] java 구간 나누기 2
2022.06.02