정답 코드
import math
def solution(r1, r2):
num = 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)))
num += y_max - y_min + 1
return num * 4
풀이
먼저, 문제에서 제시해 준 그림을 보면, 작은 원(r1)이나 큰 원(r2)사이의 정수를 모두 구하는 문제라는 것을 쉽게 알 수 있습니다. 이때, 모든 정수 쌍을 구하는 것이 아닌, 같은 패턴의 반복이므로 하나의 사분면의 정수 쌍을 모두 구한 뒤 *4를 해주면 답을 더 쉽게 구할 수 있습니다.
저는 1사분면을 기준으로, x가 1부터 r2까지 증가할 때 각각의 y의 최대, 최소값을 구하는 식으로 구현했습니다.
먼저 x가 0이 아닌 1부터 시작하는 이유는, 0을 포함해버리면 나중에 *4를 할 때, y축과 x축의 점들이 중복으로 들어가버리기 때문입니다. 따라서 x를 1부터 r2+1까지 증가시키거나, x를 0부터 r2까지 증가시키면 됩니다. 저는 x를 1부터 r2+1까지 증가시켰습니다.
그리고 각각의 y의 최대, 최솟값을 구하는 이유는 최대, 최솟값을 정수화시켜서 빼면 그 사이의 정수 갯수를 구할 수 있기 때문입니다. 예를 들어, x=1일때, y_max = sqrt(r2**2 - x**2)로 2. ~~가 되고, 이것을 floor(내림)처리해서 2로 저장합니다. 그다음, y_min = sqrt(r1**2 - x**2)로 1.~~가 되고, 이것을 ceil(올림)처리해서 2로 저장합니다. 이제 y_max - y_min + 1을 하면, x=1일때 두 원 사이의 정수 쌍은 1개라는 것을 알 수 있습니다. 이와같이 각각의 x에서 y의 최대, 최솟값을 구해서 정수의 개수를 구합니다.
이때, x가 r1보다 크거나 같아지면, 작은 원의 y 최솟값은 전부 0이므로 조건문 처리합니다.
마지막으로, 정수 개수를 *4해서 반환하면, 정답이 됩니다.