알고리즘(백준 등) 공부

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);
    }
}