
내가 생각했을때 문제에서 원하는부분
첫째 줄에 N이 주어진다.
상근이의 힌트 조건을 만족하는 (A,B) 쌍의 개수를 출력한다.
내가 이 문제를 보고 생각해본 부분
BufferedReader를 사용하여 문제에서 주어지는 정수 N를 입력을 받는다.
문제 조건인 1 <= B <= A <= 500을 만족하는 쌍을 찾기 위해 브루트포스(Brute Force) 방식을 사용한다.
A와 B의 최댓값이 500으로 비교적 작기 때문에 모든 가능한 경우를 직접 확인하는 것이 가능하다.
코드는 B 값을 1부터 500까지 순회합니다 (for(int B = 1; B <= 500; B++)).
각 B 값에 대해 A*A = B*B + N 이라는 조건을 만족하는 A를 찾는다.
이는 A*A 값이 B*B + N이 되어야 한다는 뜻이다.
B*B + N의 제곱근을 구하여 A의 후보값(A_candidate)으로 삼는다.
만약 B*B + N이 어떤 정수의 제곱이라면, 그 정수가 바로 조건을 만족하는 A가 된다.
코드는 Math.sqrt()를 사용하여 제곱근을 구하고 정수형으로 변환해준다.
구한 A_candidate를 다시 제곱하여 원래 B*B + N 값과 정확히 일치하는지 확인한다 (if(A_candidate * A_candidate == targetASquared)).
이는 B*B + N이 완전 제곱수인지 확인하는 과정이다.
B*B + N이 완전 제곱수여서 유효한 A 후보(A_candidate)를 찾았다면, 추가 조건인 A <= 500을 만족하는지 확인한다 (if(A_candidate <= 500)).
문제 조건 B <= A는 A*A = B*B + N 에서 N이 양수이므로 A가 B보다 크거나 같다는 것이 보장되어 자동으로 만족된다.
모든 조건을 만족하는 유효한 (A, B) 쌍이 발견되면 카운트 변수(count)를 1 증가시킨다.
모든 B 값에 대한 확인이 끝나면, 최종적으로 조건을 만족하는 (A, B) 쌍의 총 개수(count)를 출력한다.
코드로 구현
package baekjoon.baekjoon_28;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 백준 6131번 문제
public class Main1027 {
public static void main(String[] args) throws IOException {
// BufferedReader를 사용하여 입력을 받습니다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); // 문제에서 주어진 N 값을 읽습니다.
int count = 0; // 조건을 만족하는 (A, B) 쌍의 개수를 세는 변수입니다.
// 문제 조건: 1 <= B <= A <= 500
// 문제 조건: A*A = B*B + N
// 이 식을 A*A - B*B = N 으로 변형할 수 있습니다.
// B는 1부터 500까지의 값을 가질 수 있습니다.
// 각 B 값에 대해 A*A = B*B + N 식을 만족하는 정수 A가 있는지 확인하고,
// 이때 A가 500 이하인지 확인하면 됩니다.
for(int B = 1; B <= 500; B++) {
// A*A의 값이 되어야 하는 목표 값입니다.
int targetASquared = B * B + N;
// targetASquared의 정수 제곱근을 구합니다. 이것이 A의 후보 값이 됩니다.
int A_candidate = (int) Math.sqrt(targetASquared);
// A_candidate * A_candidate가 정확히 targetASquared와 같은지 확인합니다.
// 이는 targetASquared가 완전 제곱수인지 확인하는 과정입니다.
// 만약 완전 제곱수라면, A_candidate가 조건을 만족하는 정수 A가 됩니다.
if(A_candidate * A_candidate == targetASquared) {
// 정수 A를 찾았습니다. 이제 문제의 추가 조건(1 <= B <= A <= 500)을 확인합니다.
// B는 루프에서 1부터 500까지 돌기 때문에 1 <= B <= 500은 이미 만족합니다.
// A*A = B*B + N 이고 N >= 1, B >= 1 이므로 항상 A*A > B*B 이고,
// A와 B가 양수이므로 A > B 입니다. 따라서 B <= A 조건도 자동으로 만족됩니다.
// 남은 조건은 A <= 500 입니다.
if(A_candidate <= 500) {
// A가 500 이하이면 문제의 모든 조건을 만족하는 유효한 쌍 (A, B)입니다.
count++; // 유효한 쌍의 개수를 증가시킵니다.
}
}
}
// 조건을 만족하는 총 쌍의 개수를 출력합니다.
System.out.println(count);
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.