https://www.acmicpc.net/problem/6064
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int M, N, x, y;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int TC = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
while (TC-- > 0) {
StringTokenizer st = new StringTokenizer(br.readLine());
M = Integer.parseInt(st.nextToken());
N = Integer.parseInt(st.nextToken());
//M=x , N=y인 경우 나머지값 0 방지
x = Integer.parseInt(st.nextToken()) - 1;
y = Integer.parseInt(st.nextToken()) - 1;
int gcd = getGCD(M, N);
int lcm = (M / gcd) * (N / gcd) * gcd; //최소 공배수
int ans = -1;
for (int k = x; k <= lcm; k += M) {
if(k % N == y){
ans = k + 1;
break;
}
}
sb.append(ans).append("\n");
}
System.out.print(sb);
}
private static int getGCD(int m, int n) {
if(n == 0) return m;
return getGCD(n, m % n);
}
}
💡 브루트포스
풀이
- 규칙성 찾기 : x, y가 특정한 갭을 두고 계속 반복됨
- 1부터 하나씩 찾아나가면 시간 초과 발생
- <i : j>에서 i 값을 고정하고 단위가치(M)씩 더한 결과, k(답 후보)를 계산
- 이때 k % N == j면, k가 답이 되는 것
- 만약 목표치에 도착하기 전에 k가 M, N의 최소 공배수 값이 된다면 달력 끝남 -> -1 출력
예시) M (10) N (12) x (3) y (9) 의 경우
- M(10) 기준으로 진행, k = 3으로 시작
- 3 : 3 > 3 : 1(13) > 3 : 11(23) > 3 : 9 (33)
예시2) M(1) N(2) x(1) y(2)인 경우
- 1 : 1 > 1 : 0(=2%2) 이므로 2가 나오지 않는 오류 발생
→ 이를 방지하기 위해 x, y에 각각 1씩 빼고, 출력 시 +1해서 출력
(N보다 작게 만들어 나머지 0 방지, +1은 2:3 으로 애초에 불가능)
→ M(1) N(2) x(0) y(1) >>> 0 : 0 - 0 : 1 ∴ k = 2 (=1+1)
'Algorithm > Beakjoon' 카테고리의 다른 글
[JAVA] 백준 16928번 : 뱀과 사다리 게임 (0) | 2024.01.08 |
---|---|
[JAVA] 백준 7662번 : 이중 우선순위 큐 (1) | 2024.01.07 |
[JAVA] 백준 9019번 : DSLR (0) | 2024.01.06 |
[JAVA] 백준 14500번 : 테트로미노 (1) | 2024.01.03 |
[JAVA] 백준 9375번 : 패션왕 신해빈 (1) | 2024.01.03 |