

이 문제는 브루트포스 문제로,
<1, 1>에서 조건에 부합할 때 까지 result에 1씩 더해주어 result를 구하려고 다음과 같이 코드를 작성했다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class _6064_카잉달력 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int T = Integer.parseInt(br.readLine());
for (int i = 0; i < T; i++) {
st = new StringTokenizer(br.readLine());
int M = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
int result = 0;
int initX = 0;
int initY = 0;
for (int j = 0; j < 40000; j++) {
if (initX == x && initY == y) {
break;
} else if (initX == M && initY == N) {
result = -1;
break;
} else if (initX == M) {
initX = 1;
initY++;
result++;
} else if (initY == N) {
initY = 1;
initX++;
result++;
} else {
initX++;
initY++;
result++;
}
}
System.out.println(result);
}
}
}
틀린 풀이의 로직은 정답이지만 시간초과로 오답이었다.
공통되는 수들의 최댓값을 구하면 for문을 40000번까지 돌리지 않아도 마지막 해가 M과 N의 최소공배수인 것을 알 수 있다.
이후 시간초과가 나지 않도록 건너뛸 수 있는 부분은 건너뛰면서 result를 늘려가는 방법은 다음과 같다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int M;
static int N;
static int lcm;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int T = Integer.parseInt(br.readLine());
for (int i = 0; i < T; i++) {
st = new StringTokenizer(br.readLine());
M = Integer.parseInt(st.nextToken());
N = Integer.parseInt(st.nextToken());
int x = Integer.parseInt(st.nextToken()) - 1;
int y = Integer.parseInt(st.nextToken()) - 1;
LCM();
boolean check = false;
for (int j = x; j < lcm; j += M) {
if (j % N == y) {
System.out.println(j+1);
check = true;
break;
}
}
if (!check)
System.out.println(-1);
}
}
static void LCM() {
int max = Math.max(M, N);
int min = Math.min(M, N);
int mod = 1;
while (mod != 0) {
mod = max % min;
max = min;
min = mod;
}
lcm = M*N/max;
}
}
