반응형
https://www.acmicpc.net/problem/2981
2981번: 검문
트럭을 타고 이동하던 상근이는 경찰의 검문을 받게 되었다. 경찰은 상근이가 운반하던 화물을 하나하나 모두 확인할 것이기 때문에, 검문하는데 엄청나게 오랜 시간이 걸린다. 상근이는 시간
www.acmicpc.net
- 문제
숫자가 N개 주어졌을 때 무엇으로 이 숫자들을 나누었을 때 나머지가 같을 수 있는지 찾는 문제다.
- 해설
아래에 주석처리 된 부분이 스스로 풀어 본 건데, 마지막 % 조금 남기고 계속 틀리다고 나와서 찾아봤다.
예를 들어 3,6,34,38이 주어지면
38 - 34 = 4
34 - 6 = 28
6 - 3 = 3
이 나오는데, 이 차를 이용해서 유클리드 호제법을 이용해 최소공배수를 구해준다.
결국 나누었을 때 나머지가 같은 것들을 구하는 문제니깐 일정한 등차수열을 이루는 숫자를 구하는 문제라서 이게 통한다.
이후에 구한 최소 공배수를 이용해서 약수들을 구하는 방식을 이용해 모든 약수들을 구하고 정렬 후 출력한다.
- 풀이
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int gcd(int a, int b)
{
return (b == 0) ? a : gcd(b, a % b);
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N, temp, tempgcd;
vector<int> A, M;
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> temp;
A.push_back(temp);
}
sort(A.begin(), A.end());
tempgcd = A[1] - A[0];
for (int i = 2; i < N; i++)
{
tempgcd = gcd(tempgcd, A[i] - A[i - 1]);
}
for (int i = 2; i * i <= tempgcd; i++)
{
if (tempgcd % i == 0)
{
M.push_back(i);
if (i != tempgcd / i)
M.push_back(tempgcd / i);
}
}
M.push_back(tempgcd);
sort(M.begin(), M.end());
for (auto i : M)
{
cout << i << ' ';
}
return 0;
}
// int main()
// {
// ios_base::sync_with_stdio(false);
// cin.tie(NULL);
// cout.tie(NULL);
// int N, temp, percent, tempMeas;
// vector<int> A, M, meas;
// cin >> N;
// for (int i = 0; i < N; i++)
// {
// cin >> temp;
// A.push_back(temp);
// }
// sort(A.begin(), A.end());
// for (int i = 2; i <= A[0]; i++)
// {
// percent = -1;
// for (auto a : A)
// {
// if (percent == -1)
// percent = a % i;
// if (percent == a % i)
// {
// continue;
// }
// else
// {
// percent = -1;
// break;
// }
// }
// if (percent != -1)
// {
// M.push_back(i);
// percent = -1;
// }
// }
// tempMeas = A[1] - A[0];
// for (int i = 1; i * i < tempMeas; i++)
// {
// if (tempMeas % i == 0)
// {
// meas.push_back(i);
// meas.push_back(tempMeas / i);
// }
// }
// for (int i = 1; i < meas.size(); i++)
// {
// if (meas[i] > A[0])
// {
// percent = -1;
// for (auto a : A)
// {
// if (percent == -1)
// percent = a % meas[i];
// if (percent == a % meas[i])
// {
// continue;
// }
// else
// {
// percent = -1;
// break;
// }
// }
// if (percent != -1)
// {
// M.push_back(meas[i]);
// percent = -1;
// }
// }
// }
// sort(M.begin(), M.end());
// for (auto a : M)
// {
// cout << a << ' ';
// }
// return 0;
// }
- 새롭게 알게 된 점
X
반응형
'Algorithm > Baekjoon BOJ' 카테고리의 다른 글
[백준][C++] 2004: 조합 0의 개수 (0) | 2022.10.21 |
---|---|
[백준][C++] 3036 : 링 (0) | 2022.10.21 |
[백준][C++] 1934 : 최소공배수 (0) | 2022.10.21 |
[백준][C++] 5086 : 배수와 약수 (0) | 2022.10.21 |
[백준][C++] 1358 : 하키 (0) | 2022.10.21 |