https://www.acmicpc.net/problem/2485
2485번: 가로수
첫째 줄에는 이미 심어져 있는 가로수의 수를 나타내는 하나의 정수 N이 주어진다(3 ≤ N ≤ 100,000). 둘째 줄부터 N개의 줄에는 각 줄마다 심어져 있는 가로수의 위치가 양의 정수로 주어지며, 가
www.acmicpc.net
해결 방법
확실히 생각을 오래 하니까 쉬워졌다.
간격을 전부 구해서 배열에 저장한 후 최대공약수를 구해주고 간격을 최대공약수로 나눈 뒤 -1 만큼 해준 숫자를 모두 더해주면 된다.
ex) 1 3 7 13
2 4 6 // 간격
1 2 3 // 최대공약수 2로 나눔
0 1 2 // -1 해준다.
답 : 3
#include <iostream>
#include <algorithm>
using namespace std;
long long int euclid(long long int a, long long int b)
{
if (a % b != 0)
{
return euclid(b, a % b);
}
else
{
return b;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int N;
cin >> N;
int* arr = new int[N]();
int* itv = new int[N-1]();
for (int i = 0; i < N; i++)
cin >> arr[i];
for (int i = 0; i < N - 1; i++)
itv[i] = arr[i + 1] - arr[i];
int max_div = euclid(itv[0], itv[1]);
for (int i = 1; i < N - 2; i++)
max_div = euclid(max_div, itv[i + 1]);
int sum = 0;
for (int i = 0; i < N - 1; i++)
sum += itv[i] / max_div-1;
cout << sum;
delete[] arr;
delete[] itv;
return 0;
}
'프로그래밍 공부 > 백준 (C++)' 카테고리의 다른 글
[C++/백준 4948번] 베르트랑 공준 (0) | 2024.01.28 |
---|---|
[C++/백준 4134번] 다음 소수 (0) | 2024.01.27 |
[C++/ 백준 1735번] 분수 합 (0) | 2023.08.25 |
[C++/ 백준 13241번] 최소공배수 (0) | 2023.08.17 |
[C++/백준 11478번] 서로 다른 부분 문자열의 개수 (0) | 2023.08.16 |