728x90

https://www.acmicpc.net/problem/3474

 

3474번: 교수가 된 현우

문제 알고리즘의 킹갓제너럴엠퍼러마제스티충무공알고리즘마스터 현우가 교수로 취임하였다! 그러나 학생들에게 크나큰 기대를 품고 첫 수업에 들어갔던 현우는 아무도 외판원 순회 문제(Traveling Salesman Problem, TSP)를 풀지 못하는 것을 보고 낙심하였다. 그 와중에 학생 남규는 TSP를 완전탐색으로 풀려고 하였고, 현우는 그걸 보고 경악을 금치 못한다. 왜냐면 TSP를 완전탐색으로 풀려면 O(N!)의 시간이 소모되는데, 이는 경악을 금치 못

www.acmicpc.net

이렇게 제출했는데 시간초과가 났다.

#include <iostream>
#include <vector>
using namespace std;

int main() {
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);
	int n;
	cin >> n;
	vector<int> v(n);
	for (int i = 0; i < n; i++) {
		cin >> v[i];
	}
	int five[] = { 1, 5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625, 48828125, 244140625, 1220703125 };
	int index = 1;
	int vectorIndex = 0;
	int now = 0;
	int previous = 0;
	for (int i = 1; i <= 1000000000; i++) {
		int increase;
		for (int j = index; j >= 0; j--) {
			if (i % five[j] == 0) {
				increase = j;
				if (j == index)
					index++;
				break;
			}
		}
		now = previous+ increase;

		if (i == v[vectorIndex]) {
			cout << now << '\n';
			vectorIndex++;
			if (vectorIndex == n) break;
		}
		previous = now;
	}
	return 0;
}

대략 반복문 수행 횟수가 10000000 넘어가면 1초 넘는데 얘는 1000000000에 이중 for문이니까 당연히 시간초과가 난다.

 

이렇게 다시 풀었다.

#include <iostream>
#include <vector>
using namespace std;

int main() {
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		int num;
		cin >> num;
		int count = 0;
		for (int j = 5; j <= num; j *= 5) {
			count += num / j;
		}
		cout << count << '\n';
	}
	return 0;
}
728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 1431번 시리얼 번호  (0) 2020.02.15
[백준] 1100번 하얀 칸  (0) 2020.02.15
[백준] 10816번 숫자 카드 2  (0) 2020.02.13
[백준] 1920번 수 찾기  (0) 2020.02.13
[백준] 2902번 KMP는 왜 KMP일까?  (0) 2020.02.12

+ Recent posts