두 원 사이의 정수 쌍
문제 설명 이외에 제한 사항은 생략하였다. 필요한 부분은 언급하며 진행할텐데 모든 정보를 적을 필요는 없다고 판단하여 적지 않았다
문제 설명
x축과 y축으로 이루어진 2차원 직교 좌표계에 중심이 원점인 서로 다른 크기의 원이 두 개 주어집니다. 반지름을 나타내는 두 정수 r1, r2가 매개변수로 주어질 때, 두 원 사이의 공간에 x좌표와 y좌표가 모두 정수인 점의 개수를 return하도록 solution 함수를 완성해주세요.
※ 각 원 위의 점도 포함하여 셉니다.
흐름 파악
흐름 파악을 위해 꼬리에 꼬리를 무는 방식으로 접근하려한다.
어떤 값을 반환해야해?
원2.점_갯수 - 원1.점_갯수 을 반환하면 돼
원이 가진 점의 갯수는 어떻게 구해?
조금 복잡한데 사실 간단한 문제야!
원을 4등분한 뒤 1쪽 면의 정수인 좌표를 구하고 4를 곱하면 돼 그 후 가운데 원이 있기 때문에 1을 더해주면 돼
원의 점의 갯수 구하기
points_in_circle 에 원의 반지름을 넣으면 정수 좌표인 갯수를 반환한다.
outlines 는 명명 그대로 원의 외곽에 있는 정수 좌표의 갯수를 의미한다. outlines 가 필요한 이유는 원2 - 원1 일 때 원1 의 외곽에 있는 정수 좌표의 갯수를 더해주기 위해서다.
v == math.sqrt(r2 - y * y) 는 외곽에 위치에 했으나 정수로 떨어지는 경우를 의미한다.
def points_in_circle(radius):
r = radius
res = 0
outlines = 0
r2 = r * r
for y in range(r + 1):
v = int(math.sqrt(r2 - y * y))
res += v
if v > 0 and v == math.sqrt(r2 - y * y):
outlines += 1
return res * 4 + 1, outlines * 4
테스트 데이터
print(solution(1, 2)) # 12
print(solution(1, 3)) # 28
print(solution(1, 4)) # 48
print(solution(2, 3)) # 20
print(solution(2, 6)) # 104
실제 코드
원2.점_갯수 - 원1.점_갯수 + 원1.outlines 좌표의 갯수
def solution(r1, r2):
p1, o1 = points_in_circle(r1)
p2, o2 = points_in_circle(r2)
return p2 - p1 + o1