본문 바로가기

문제 풀이/문제 풀이(BOJ)

[Silver IV] 가로수 - 2485

[문제 위치]

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

[문제 풀이]

유클리드 호제법을 활용하는 문제이다.

 

유클리드 호제법을 통해 최대공약수를 구하고 나무 사이의 간격을 바탕으로 심는 가로수의 갯수를 구해주면 된다.

 

양 끝단의 나무 수를 후처리 해줘야 하는 등 수학 문제와 유사한 해결 방식을 따른다.

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

int tree[100000];
int tree_distance[100000];

// 최대공약수를 구하는 함수 (유클리드 호제법)
int Euclidean(int a, int b) {
	int r = a % b;
	if (r == 0)
		return b;
	else
		return Euclidean(b, r);
}

int main() {
	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;
}

'문제 풀이 > 문제 풀이(BOJ)' 카테고리의 다른 글

[Bronze III] 사분면 - 9610  (0) 2025.06.14
[Silver II] 별 찍기 - 22  (0) 2025.06.08
[Bronze II] 수 뒤집기 - 3062  (0) 2025.06.08
[Bronze II] NN - 11944  (0) 2025.06.08
[Silver I] 곱셈 - 1629  (0) 2025.06.06