일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 브루트포스
- dp
- 다이나믹 프로그래밍
- 자바의정석연습문제
- 무료개발강의
- 빅오 표기법
- 시간 복잡도
- dfs
- 알고리즘
- 백준
- BFS
- 자바공부
- Java개념
- 백준자바
- 자바의정석연습문제풀이
- 백준단계별로풀어보기
- ★
- 코딩공부
- java
- 자바개념
- 자바의정석
- ☆
- 자바
- 동적계획법
- 무료코딩강의
- 백준알고리즘
- 알고리즘공부
- 백트래킹
- 백준9단계
- 개발공부
- Today
- Total
더 많이 실패하기
공부 97일차: 백준 1676번 팩토리얼 0의 개수 자바 java 본문
1676 팩토리얼 0의 개수
https://www.acmicpc.net/problem/1676
1676번: 팩토리얼 0의 개수
N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
백준 1676번 문제 팩토리얼 0의 개수
문제
과정 생각해보기
주어진 n의 범위가 0부터 500인데, 500! 이라면 엄청 큰 수라는 걸 알 수 있다
10!만 하더라도 3628800이 나오니 말이다
그래서 500!을 직접 구하기보다는, 0이 붙을 때마다 카운트를 +1하는 것이 맞는 방향이라고 할 수 있겠다
0이 붙을 수 있는 경우를 생각해보면,
1) 10, 100, 300 등 10의 배수로 나눴을 때 나머지가 없는(딱 나누어 떨어지는) 수들
2) 5*2, 15*4 등 2와 5의 배수를 곱했을 때
다른 것처럼 나눠놨지만 결국 같은 말을 하고 있다
두 가지 경우의 공통점은 모두 10, 즉 2*5가 들어간다는 것이다
결국 0의 개수를 구한다는 것은 2와 5가 몇 번 같이 나오는지를 세는 것과 같다
모든 수를 소인수분해해보면 2는 항상 5보다 많이 등장하므로, 5의 개수만 세면 된다
방법은 두 가지로 나눌 수 있다
1) 반복문으로 5의 개수를 세는 경우
2) 5, 25(5*5), 125(5*5*5)의 배수가 나올 때마다 개수 세기(5*5*5*5=625 > 500이라 제외)
정답 인정 코드
1) 5, 25, 125 활용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int count = 0;
count += n/5; // 5^1
count += n/25; // 5^2
count += n/125; // 5^3
// n이 5보다 작을 경우 0, 즉 count의 초기값을 그대로 가져가므로 따로 계산할 필요 없다
System.out.println(count);
}
}
|
cs |
for문 안에 while문을 반복하고 count를 1씩 늘려보는 방법은 시간 초과가 떠서 사용한 방법
2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int count = 0;
while(n >= 5) {
count += n/5;
n /= 5;
}
// n이 5보다 작을 경우 0, 즉 count의 초기값을 그대로 가져가므로 따로 계산할 필요 없다
System.out.println(count);
}
}
|
cs |
https://st-lab.tistory.com/165
이 블로그에 더 간단한 방법이 있어서 옮겨봤다
결국 1번 풀이와 같은 방식이긴 하다
'알고리즘 > 백준' 카테고리의 다른 글
공부 99일차: 백준 12871번 무한 문자열 자바 java (0) | 2022.11.06 |
---|---|
공부 98일차: 백준 2004번 조합 0의 개수 자바 java (0) | 2022.11.05 |
공부 96일차: 백준 6588번 골드바흐의 추측 자바 java (0) | 2022.11.03 |
공부 95일차: 백준 1934번 최소공배수 자바 java (0) | 2022.11.02 |
공부 94일차: 백준 2609번 최대공약수와 최소공배수 자바 java (0) | 2022.11.01 |