카잉 달력
19 June 2019
문제 : https://www.acmicpc.net/problem/6064
이번은 주어진 네 숫자를 규칙을 찾아 바꾸는 문제를 풀어보도록 하겠습니다.
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int size = sc.nextInt();
for (int i = 0; i < size; i++) {
int m = sc.nextInt();
int n = sc.nextInt();
int x = sc.nextInt();
int y = sc.nextInt() % n;
int ret = -1;
int startX = x;
while (startX < m * n) {
if (startX % n == y) {
ret = startX;
break;
}
startX += m;
}
System.out.println(ret);
}
}
}
주어진 문제에서 공식을 찾아내기 위해서 먼저 주어진 예시를 보도록 하겠습니다.
3
10 12 3 9
10 12 7 2
13 11 5 6
가장 첫 줄에 있는 예시를 공식으로 바꾸면 10*a + 3 = 12*b + 9로 나타낼 수 있습니다.코드에서 받는 변수로 나타내면 m*a + x = n*b + y 입니다.
여기서 a,b는 각각의 수로 변화할 수 있지만 m*a + x와 n*b + y는 문제의 제한조건에 의해 m*n 보다 커질 수 없습니다.
따라서 m*n보다 작을 동안 m*a + x를 a를 0부터 대입해서 값을 구하고, 해당 값을 n으로 나누었을 때 나머지가 y가 나오면 공식이 성립하게 됩니다.
다만 여기서 예외는 n과 y가 같을 경우입니다. 만약, n과 y가 모두 3이라면 x % 3 != 3 이므로 y를 n으로 나누어주고 시작합니다.
위와 같은 방식으로 값을 구하고, 값이 없을때는 -1을 return 해줍니다.