본문 바로가기
백준

[백준/C++] 2485 가로수 (유클리드호제법, 최대공약수)

by MY블로그 2023. 5. 2.
 

2485번: 가로수

첫째 줄에는 이미 심어져 있는 가로수의 수를 나타내는 하나의 정수 N이 주어진다(3 ≤ N ≤ 100,000). 둘째 줄부터 N개의 줄에는 각 줄마다 심어져 있는 가로수의 위치가 양의 정수로 주어지며, 가

www.acmicpc.net

이미 심어져있는 가로수의 개수 (N) 이 주어지고

가로수 N개의 각각의 위치가 주어진다.

주어진 위치의 간격을 모두 같은 간격으로 맞추고자할때

추가로 몇개의 가로수(count)가 필요한지 구하는 문제이다.

 

1. 주어진 가로수 위치의 간격을 구한다.

2. 모든 간격의 최대 공약수를 구한다. (유클리드 호제법 필요!)

3. 모든간격을 최대공약수로 나누어주되 시작점과 끝점이 주어져있으므로 -1하면 count가 된다.

 

유클리드 호제법과 최대공약수를 쉽게 이해할 수 있는 블로그를  참고하자 !

 

 

유클리드 호제법(Euclidean-algorithm)

유클리드 호제법에 대해 알아보자.

velog.io

+

최대공약수

 

최대공약수, 최대공약수 구하는 방법

이번에는 최대공약수에 대해서 더 알아볼 거예요. 이제까지는 최대공약수를 구할 때 일단 약수를 모두 구해놓고 그중에서 가장 큰 걸 찾았잖아요. 약수를 모두 구해야 하는 아주 귀찮은 방법이

mathbang.net

 

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#define fastio cin.tie(0)->ios::sync_with_stdio(0); cout.tie(0);
using namespace std;
int Euclidean(int a, int b) { // 최대공약수 구하는 유클리드 호재법
	int r = a % b;
	if (r == 0) return b;
	else return Euclidean(b, r);
}
int main() {
    fastio;
	int N; // 처음주어지는 가로수의 수
	int gcd = 0; // 최대공약수
	int count = 0; // 추가할 가로수의 수
	cin >> N;
	for (int i = 0; i < N; i++) {
		cin >> tree[i]; // 가로수의 수만큼 거리(크기)입력
	}
	sort(tree, tree + N); // 정렬 함수
	for (int i = 0; i < N - 1; i++) { // 다음가로수의 위치와 현재가로수위치의 거리간격
		tree_distance[i] = tree[i + 1] - tree[i];
	}
	gcd = tree_distance[0]; // 가로수간의 최대공약수 구하는 반복문
	for (int i = 1; i < N - 1; i++) {
		gcd = Euclidean(gcd, tree_distance[i]);
	}
	for (int i = 0; i < N - 1; i++) { // 시작지점 끝지점을 제외해야해서 -1해준다.
		count += (tree_distance[i] / gcd) - 1;	
	}
	cout << count; // 필요한 가로수의 개수 출력
	return 0;
}

'백준' 카테고리의 다른 글

[백준/C++] 24479 알고리즘 수업 - 깊이 우선 탐색 1  (0) 2023.05.06
[백준/C++] 10845 큐  (0) 2023.05.03
[백준/C++] 1914 하노이 탑  (0) 2023.04.25
[백준/C++] 1181 단어 정렬  (0) 2023.04.11
[백준/C++] 1094 막대기  (0) 2023.04.10

댓글