카잉 달력 문제 풀기
2018, Jun 27
백준에 있는 카잉달력 문제를 풀어보았다. 문제링크
문제의 조건은 이렇다.
M 과 N 보다 작거나 같은 두 개의 자연수 x, y를 가지고 각 년도를
#include <stdio.h>
void kaying(int M, int N, int x, int y)
{
// 유클리드 호제법을 이용, 최대공약수를 구한다.
int a = M, b=N;
int modValue = a % b;
while(1)
{
if(!modValue)
break;
a = b;
b = modValue;
modValue = a%b;
}
int gcd = b;
// 최소공배수를 구한다.
int lcm = (M*N) / gcd;
// x 값에 해당하는 _y 값을 찾는다.
int _y = (x%N)==0 ? N : x%N;
// 몇 번째 해인지 저장한다.
int year = x;
// 최소공배수까지 _y == y 인 값을 찾는다.
while(1)
{
if(year > lcm)
{
year = -1;
break;
}
if(_y == y)
break;
_y = _y +M;
_y = (_y%N==0) ? N : _y%N;
year = year + M;
}
printf("%d\n", year);
}
#include <cstdio>
// 최소공배수를 구한다.
int lcm(int m, int n)
{
int z,a,b;
a = m; b= n;
while(1)
{
z = a%b;
if(z==0) break;
a = b; b = z;
}
return (m*n)/b;
}
int main()
{
// t번 문제를 푼다. (문제의 조건임. 위에서는 구현안함.)
int t; scanf("%d", &t);
while(t--)
{
int M,N,x,y;
scanf("%d%d%d%d",&M,&N,&x,&y);
// M, N의 최소공배수를 구한다.
int mm = lcm(M,N);
// x와 y값을 비교해서 작은 값에 m, n을 더하고
// x== y가 될 때의 x를 반환하면 된다.
// x<= 최소공배수(M,N)까지 반복한다.
while(x!==y && x<=mm)
{
if(x<y) x+=m;
else y+= n;
}
if(x!=y) printf("-1\n");
else printf("%d\n",x);
}
return 0;
}