중심이 (0,0)이고 반지름이 1 ≤ r1 < r2 ≤ 1,000,000 인 원 2개가 주어질 때 반지름 r1인 원과 반지름 r2인 원 사이에 존재하는 점들 중 (정수, 정수)인 좌표의 개수를 구해라. (경계선 포함)
ex)
r1, r2 = 2, 3
정수로 이루어진 좌표들의 특징은 x축, y축으로 대칭을 이룬다는 것이다.
즉, 1개의 사분면에 대해서만 개수를 구해주고 4배를 해주면 된다. 단, 주의할 점이 있는데 x축이나 y축 둘 중 한쪽은 포함하지 않아야 4배를 했을 때 정답이 된다. 그렇지 않으면 중복해서 개수에 포함이된다.
나머지 설명은 코드 주석으로 하겠다.
def solution(r1, r2):
answer = 0
maxY, minY = 0, 0
# 1사분면만 구하고 4배를 해주기 위해 y축은 제외
for x in range(1, r2 + 1):
# 큰 원 기준으로 y를 구해주고 가까운 정수로 내려주면
# 현재 정수 x에서 가질 수 있는 최대 정수 y
maxY = math.floor(math.sqrt(r2**2 - x**2))
if x >= r1:
minY = 0
else:
# 작은 원 기준으로 y를 구해주고 가까운 정수로 올려주면
# 현재 정수 x에서 가질 수 있는 최소 정수 y
minY = math.ceil(math.sqrt(r1**2 - x**2))
answer += (maxY - minY + 1) * 4
return answer