Solved.ac Class3++
최대 공약수: n개의 수를 나눌 수 있는 가장 큰 수
유클리드 호제법을 이용한다.
최소 공배수: 두수에 서로 공통으로 존재하는 배수 중 가장 작은 수
두수의 곱을 최대공약수로 나누면 끝
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int size = Integer.parseInt(br.readLine());
for (int i = 0; i < size; i++) {
String[] data = br.readLine().split(" ");
sb.append(solve(Integer.parseInt(data[0]), Integer.parseInt(data[1]), Integer.parseInt(data[2]),
Integer.parseInt(data[3]))).append("\n");
}
System.out.println(sb);
}
private static int solve(int m, int n, int x, int y) {
while (x != y ) {
if (x < y) {
x += m;
} else {
y += n;
}
if (x > 40000) {
return -1;
}
}
return x;
}
}
실패
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int size = Integer.parseInt(br.readLine());
for (int i = 0; i < size; i++) {
String[] data = br.readLine().split(" ");
sb.append(solve(Integer.parseInt(data[0]), Integer.parseInt(data[1]), Integer.parseInt(data[2]),
Integer.parseInt(data[3]))).append("\n");
}
System.out.println(sb);
}
private static int solve(int m, int n, int x, int y) {
int lcm = lcm(m, n);
while (x != y) {
if (x < y) {
x += m;
} else {
y += n;
}
if (x > lcm) {
return -1;
}
}
return x;
}
private static int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}
private static int lcm(int a, int b) {
return a * b / gcd(a, b);
}
}
문제를 읽다가 오류를 범했다. 이렇게 쉽다고? 했는데 역시 그럴리가.
핵심은 어디서 끝낼지인데. 문제에서 알려줬듯이 M,N 두 수가 만나는 지점이다. 이 지점은 최소공배수로 구할 수 있다.
성공
fun main() {
val toKotlin = Problem6064ToKotlin()
val size = readln().toInt()
val sb = StringBuilder()
for (i in 1..size) {
val data = readln().split(" ")
sb.append(toKotlin.solve(data[0].toInt(), data[1].toInt(), data[2].toInt(), data[3].toInt())).append("\n")
}
print(sb)
}
class Problem6064ToKotlin {
fun solve(m: Int, n: Int, x: Int, y: Int): Int {
val lcm = lcm(m, n)
var newX = x
var newY = y
while (newX != newY) {
if (newX < newY) {
newX += m
} else {
newY += n
}
if (newX > lcm) {
return -1
}
}
return newX
}
private fun gcd(a: Int, b: Int): Int {
if (b == 0) return a
return gcd(b, a % b)
}
private fun lcm(a: Int, b: Int): Int {
return a * b / gcd(a, b)
}
}