Study/Problem Solving
[BOJ_2436] 공약수
monitor
2023. 12. 5. 08:24
설명
최대공약수 * 최소공배수를 진행하면 내가 뽑을 수도 같은 숫자를 가질 수 있다는 것은 파악을 하였다. 하지만, 이를 서로소로 만들어서 풀 생각은 하지 못하였는데 그냥 1~N까지 모두 탐색하면 시간초과가 날것이 뻔하니 최대공약수로 나눠서 탐색하면 x,y값 모두 서로소가 되고 이때 최대 공약수를 곱해서 GCD 여부가 같은지 체크하면 된다.
6 * 180 = 30 * 36 -> x,y 모두 서로소로 만들기 위해서 모든 변수에 GCD로 나눈다. => 1 * 30 = 5 * 6
이런 형태가 나올 것이고 이를 아래와 같은 코드로 구현하였다.
코드
package Math;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class BOJ_2436 {
static class Data implements Comparable<Data>{
int x;
int y;
public Data(int x,int y){
this.x = x;
this.y = y;
}
@Override
public int compareTo(Data o) {
return Integer.compare((this.x + this.y),(o.x + o.y));
}
}
public static void main(String[] args) throws Exception{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer tk = new StringTokenizer(in.readLine()," ");
PriorityQueue <Data> pq = new PriorityQueue<>();
int A = Integer.parseInt(tk.nextToken());
int B = Integer.parseInt(tk.nextToken());
int tmp = B/A;
for (int i = 1; i <= tmp; i++){
if(tmp % i == 0){
int b = tmp / i;
if(A == GCD(i*A,b*A)) {
pq.add(new Data(i, b));
}
}
}
int x = pq.peek().x * A;
int y = pq.peek().y * A;
System.out.println(x > y ? y + " " + x : x + " " + y);
}
private static int GCD(int a,int b){
if(b == 0){
return a;
}
return GCD(b, a%b);
}
}
2436번: 공약수
첫째 줄에 두 개의 자연수가 빈칸을 사이에 두고 주어진다. 첫 번째 수는 어떤 두 개의 자연수의 최대공약수이고, 두 번째 수는 그 자연수들의 최소공배수이다. 입력되는 두 자연수는 2 이상 100,0
www.acmicpc.net