문제링크 : https://www.acmicpc.net/problem/6064
문제풀이
규칙찾는 데 좀 시간이 걸렸던 문제.. 규칙을 찾고 나면 쉬운 문제인 것 같다.
N = 6, M = 7 을 입력받은 경우로 해를 나열해보면 아래와 같다.

x = 3 입력값을 받았다고 가정하였을 때, 아래와 같은 규칙을 찾을 수 있다.

x가 3일 때 나오는 해는 x에 N을 더해서 구할 수 있고,
x가 3일 때 나오는 y값들은, 앞에서 구한 해를 M으로 나눈 나머지와 같다.
이를 이용해 y 입력값과 같은 값이 나올 때 까지 반복하여 해를 구한다.
마지막 해는 문제에서도 힌트를 줬듯이, N과 M의 최소공배수와 같다.
따라서 N과 M의 최소공배수보다 큰 경우는 유효하지 않으므로 -1을 출력한다.
소스코드
/*
* 백준 6064번: 카잉 달력
*/
#include <iostream>
#include <string>
using namespace std;
int gcd(int a, int b);
int lcd(int a, int b);
int main() {
int T;
cin >> T;
while (T--) {
int M, N, x, y;
cin >> M >> N >> x >> y;
int year = x;
int temp_y = 0;
int l = lcd(M, N);
while (true) {
temp_y = year % N == 0 ? N : year % N;
if (temp_y == y) break;
if (year > l) break; // N과 M의 최소공배수보다 큰 경우
year += M;
}
year = year > l ? -1 : year;
cout << year << endl;
}
return 0;
}
// 최대공약수
int gcd(int a, int b) {
int r = 0;
while (b > 0) {
r = a % b;
a = b;
b = r;
}
return a;
}
// 최소공배수
int lcd(int a, int b) {
return a * b / gcd(a, b);
}'Algorithm > 문제풀이' 카테고리의 다른 글
| [백준] 10989번: 수 정렬하기3 (0) | 2019.06.08 |
|---|---|
| [백준] 2750번: 수 정렬하기 (0) | 2019.05.23 |
| [백준] 1475번: 방 번호 (0) | 2019.05.21 |
| [백준] 1157번: 단어 공부 (0) | 2019.05.21 |
| [백준] 1924번: 2007년 (0) | 2019.05.19 |