백준/약수, 배수와 소수
2485번: 가로수 [C++]
Koalitsiya
2023. 3. 29. 11:45
문제
풀이
먼저, 주어진 나무의 위치를 받아 오름차순으로 정렬한다. 그리고 각 나무 사이의 간격을 구하고 그 간격들의 최대공약수를 구한다. 이 최대공약수만큼의 간격을 가지고 나무를 심으면 가장 적게 심을 수있다.
(개수를 셀 때 -1을 해주는 것은 양 쪽에 나무가 심겨져 있기 때문이다.)
#include <iostream>
#include <algorithm>
using namespace std;
int trees[100000];
int betweenTree[100000];
int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}
int main() {
int n;
int count = 0;
cin >> n;
for (int i = 0; i < n; i++)
cin >> trees[i];
sort(trees, trees + n);
for (int i = 1; i < n; i++)
betweenTree[i - 1] = trees[i] - trees[i - 1];
int interval = betweenTree[0];
for (int i = 1; i < n - 1; i++)
interval = gcd(interval, betweenTree[i]);
for (int i = 0; i < n - 1; i++)
count += betweenTree[i] / interval - 1;
cout << count;
return 0;
}