문제출처: https://www.acmicpc.net/problem/1676
풀이
도대체 어떻게 풀 수 있는 문제일까 고민을 많이 했는데 딱히 떠오르지 않아서 구글링을 통해 10은 2*5으로 이루어진다는 힌트만 얻고 대충 1!부터 10!부터 노트에 적어보며 규칙성을 찾아보았습니다. (사실 위의 힌트가 정답의 전부입니다.)
1!= 1*1
2!= 2*1
3!= 3*2*1
4!= 4*3*2*1
5!= 5*4*3*2*1
6!= 6*5*4*3*2*1
7!= 7*6*5*4*3*2*1
8!= 8*7*6*5*4*3*2*1
9!= 9*8*7*6*5*4*3*2*1
10!= 10* 9*8*7*6*5*4*3*2*1
이렇게 펼쳐본다음 위에서 얻은 힌트를 이용해서 팩토리얼을 구성하는 숫자들을 2와 5로 쪼개어 보았습니다. 그리고 쪼갠 숫자들을 나열하여 2와 5가 각각 몇번 나오는 지를 세어보았습니다.
2!= 2*1 => 2: 1개, 5: 0개
3!= 3*2*1 => 2: 1개, 5: 0개
4!= 2*2*3*2*1 => 2: 3개, 5: 0개
5!= 5*2*2*3*2*1 => 2: 3개, 5: 1개
6!= 2*3*5*2*2*3*2*1 => 2: 4개, 5: 1개
7!= 7*2*3*5*2*2*3*2*1 => 2: 4개, 5: 1개
8!= 2*2*2*7*2*3*5*2*2*3*2*1 => 2: 7개, 5: 1개
9!= 9*2*2*2*7*2*3*5*2*2*3*2*1 => 2: 7개, 5: 1개
10!= 2*5*9*2*2*2*7*2*3*5*2*2*3*2*1 => 2: 8개, 5: 2개
1!~ 10! 까지 계산된 수를 모두 구해서 정답을 구해보면 위의 규칙성 중 팩토리얼 숫자 중 2로 구성된 수의 갯수와 5로 구성된 수의 갯수 중 더 적은 갯수와 일치함을 알 수 있습니다.
알고리즘을 알았으니 반복문을 통해 식을 작성할 텐데 각 팩토리얼 수의 2와 5의 갯수를 구하는 식은 아래 소스코드에 나와있습니다.
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include<iostream> #include<algorithm> using namespace std; int main() { cin.tie(0); cin.sync_with_stdio(false); int n; int two = 0, five = 0; cin >> n; for (int i = 2; i <= n; i = i * 2) two += n / i; for (int i = 5; i <= n; i = i * 5) five += n / i; cout << min(two, five); return 0; } | cs |
'문제풀이(BOJ) > 규칙찾기' 카테고리의 다른 글
[백준 14954] Happy Number (0) | 2020.03.10 |
---|---|
[백준 1652] 누울 자리를 찾아라 (2) | 2020.01.15 |
[백준 1855] 암호 (0) | 2020.01.06 |
[백준 3076] 상근이의 체스판 (0) | 2020.01.03 |
[백준 1551] 수열의 변화 (0) | 2020.01.03 |