알고리즘/백준
[백준][C++] 17087: 숨바꼭질 6
KANTAM
2024. 1. 19. 20:53
문제
17087번: 숨바꼭질 6
수빈이는 동생 N명과 숨바꼭질을 하고 있다. 수빈이는 현재 점 S에 있고, 동생은 A1, A2, ..., AN에 있다. 수빈이는 걸어서 이동을 할 수 있다. 수빈이의 위치가 X일때 걷는다면 1초 후에 X+D나 X-D로 이
www.acmicpc.net
풀이
유클리드 호제법
S에서 일정한 간격으로 이동할 때, 모든 A에 도달해야 한다. 즉, 간격이 모든 A와의 차이의 공약수여야만 한다. 이 간격 중 최댓값이므로, 최대공약수가 정답이다.
코드
#include <iostream>
using namespace std;
vector<int> diffs;
int gcd(int a, int b)
{
if (a < b)
{
swap(a, b);
}
int temp;
while (b != 0)
{
temp = a % b;
a = b;
b = temp;
}
return a;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(NULL);
cout.tie(NULL);
int N, S;
cin >> N >> S;
// 현재 위치 S와의 차이를 저장
for (int i = 0; i < N; ++i)
{
int temp;
cin >> temp;
diffs.push_back(abs(temp - S));
}
// 모든 차이의 gcd를 출력
int answer = diffs[0];
for (int i = 1; i < diffs.size(); ++i)
{
answer = gcd(answer, diffs[i]);
}
cout << answer;
return 0;
}