x축과 y축으로 이루어진 2차원 직교 좌표계에 중심이 원점인 서로 다른 크기의 원이 두 개 주어집니다. 반지름을 나타내는 두 정수 r1, r2가 매개변수로 주어질 때, 두 원 사이의 공간에 x좌표와 y좌표가 모두 정수인 점의 개수를 return하도록 solution 함수를 완성해주세요. ※ 각 원 위의 점도 포함하여 셉니다.
제한 사항
1 ≤ r1 < r2 ≤ 1,000,000
입출력 예r1r2result
2
3
20
입출력 예 설명
그림과 같이 정수 쌍으로 이루어진 점은 총 20개 입니다.
정답 풀이
import math
def solution(r1, r2):
answer = 0
for x in range(1, r2 + 1):
y_max = math.floor(math.sqrt(r2 ** 2 - x ** 2))
y_min = 0 if x >= r1 else math.ceil(math.sqrt(abs(r1 ** 2 - x ** 2)))
answer += y_max - y_min + 1
return answer * 4
우선 원의 1/4만큼만 구해서 곱하기 4를 한다.
x^2 + y^2 = r^2을 이용하여 y^2 = r^2 - x^2을 이용하여 푼다.
y_max는 각 x에서의 최대 높이 값으로, r2의 원 내의 가장 높은 높이를 구하고 floor()를 한다.
y_min은 각 x에서의 최소 높이 값으로, x가 r1을 넘을 경우는 r1을 지난 경우이므로 0으로 하고, 아닐 경우에는 r1 내의 가장 높은 높이를 구하고 ceil()을 한다.
floor()와 ceil()을 해도 상관없도록 answer에 추가할 때마다 1씩 더해준다.