Koder / 박성훈
article thumbnail

이 문제의 핵심은 최대공약수이다.

이걸 중학교 2학년때 풀었던거같은데

그때 한참걸렸던걸

지금 몇분만에 풀어내는걸 보니

참 감회가 새롭다.. ㅋㅋ

 

가장 먼 나무 - 가까운 나무로

길이를 구하고,

최대공약수로 나눠준 다음

가장 끝에 +1 해줘서 나무의 전체 수를 구한다.

그다음 입력된 나무의 수인 N을 빼주면

우리가 원하는 답을 찾을 수 있다.

 

#include <stdio.h>
#include <algorithm>

using namespace std;
typedef long long int ll;

int input[123456] = {0};
int arr[123456]   = {0};

ll gcd(ll a, ll b){
	while(b!=0){
		ll r = a%b;
		a = b;
		b = r;
	}
	return a;
}

int main(){
	int n;
	scanf("%d", &n);
	for(int i=0; i<n; i++) scanf("%d", &input[i]);
	
	sort(input, input+n);
	for(int i=1; i<n; i++){ arr[i] = input[i]-input[i-1]; }
	for(int i=2; i<n; i++){ arr[i] = gcd(arr[i], arr[i-1]); }
	
	printf("%d", (input[n-1]-input[0])/arr[n-1]-n+1);
	return 0;
}

arr[]는 최대공약수를 구하기 위해 나무 간의 거리를 저장해두기도 하고,

그 나무들의 최대공약수를 구할때도 사용되는 배열이다.

 

 

반응형