알고리즘(백준 등) 공부
SWEA 25837. 합과 곱
posite
2026. 4. 8. 13:42
두 자연수의 합과 곱이 주어질 때 이를 만족하는 두 자연수가 존재하는지 확인하는 문제이다. 합과 곱은 10^12 이하이다.
합과 곱에 맞게 1부터 끝까지 찾을 수 없으므로 2차 방정식의 근의 공식을 이용하여 합과 곱을 만족하는 수를 찾는다. 이때, 수가 long의 범위에 벗어날 수 있으므로 Double로 계산한 후 long으로 casting 해준다. 계산해낸 두 수가 자연수가 아니라면 "No"를, 두 수 모두 자연수라면 "Yes"를 StringBuilder에 append한다.
double S = Double.parseDouble(st.nextToken()), P = Double.parseDouble(st.nextToken());
long a = (long) ((S + Math.sqrt(S*S-4*P))/2), b = (long) ((S - Math.sqrt(S*S-4*P))/2);
if(a <= 0 || b <= 0) {
sb.append("No");
} else if((S + Math.sqrt(S*S-4*P))%2 != 0 || (S - Math.sqrt(S*S-4*P))%2 != 0) {
sb.append("No");
} else {
sb.append("Yes");
}
결과 코드는 다음과 같다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Solution {
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());
double S = Double.parseDouble(st.nextToken()), P = Double.parseDouble(st.nextToken());
long a = (long) ((S + Math.sqrt(S*S-4*P))/2), b = (long) ((S - Math.sqrt(S*S-4*P))/2);
if(a <= 0 || b <= 0) {
sb.append("No");
} else if((S + Math.sqrt(S*S-4*P))%2 != 0 || (S - Math.sqrt(S*S-4*P))%2 != 0) {
sb.append("No");
} else {
sb.append("Yes");
}
sb.append('\n');
}
br.close();
System.out.print(sb);
}
}