https://school.programmers.co.kr/learn/courses/30/lessons/181187
각 4분면이 동일하므로 1분면만 구한 후 4를 곱해준다.
원의 방정식 (
x^2 + y^2 = r^2
) 을 이용해
x가1 ~ r2
일때minY
,maxY
를 각각 구한다.
- minY =
root(r1^2 - x^2)
이다. 이 때 올림을 해주어 정수로 만들어준다.
- x가 r1보다 큰 경우, minY는 무조건 0이 된다.
- maxY =
root(r2^2 - x^2)
이다. 이 때 내림을 해주어 정수로 만들어준다.
각 정수 내에 있는 것을 고르면 된다.
주의할 점 :
r의 입력값이 최대 백만이므로, 제곱을 하면 범위가 초과될 수 있다.long long
으로 타입 변환을 해주기
#include <string>
#include <vector>
#include <cmath>
using namespace std;
int getY(int x, int r, bool isMin)
{
// y = root(r^2 - x^2)
if (isMin) return ceil(sqrt((long long)r*r - (long long)x*x));
else return floor(sqrt((long long)r*r - (long long)x*x));
}
long long solution(int r1, int r2) {
long long answer = 0;
int minY, maxY;
for(int x=1; x<=r2; x++)
{
if (x < r1)
{
minY = getY(x, r1, true);
}
else
{
minY = 0;
}
maxY = getY(x, r2, false);
answer += maxY - minY + 1;
}
return answer * 4;
}
단순한 듯 어려웠던 문제.. 원의 방정식이 생각이 안났고
원리를 안 후에는 타입이 틀려서 다시 풀었다
https://kjimin0619.tistory.com/63
https://tnsn.tistory.com/6