알고리즘 Lv2. 두 원 사이의 정수 쌍

두 원 사이의 정수 쌍

프로그래머스 문제

문제 설명 이외에 제한 사항은 생략하였다. 필요한 부분은 언급하며 진행할텐데 모든 정보를 적을 필요는 없다고 판단하여 적지 않았다

문제 설명

x축과 y축으로 이루어진 2차원 직교 좌표계에 중심이 원점인 서로 다른 크기의 원이 두 개 주어집니다. 반지름을 나타내는 두 정수 r1, r2가 매개변수로 주어질 때, 두 원 사이의 공간에 x좌표와 y좌표가 모두 정수인 점의 개수를 return하도록 solution 함수를 완성해주세요.

※ 각 원 위의 점도 포함하여 셉니다.

두원사이의정수쌍-1.png

흐름 파악

흐름 파악을 위해 꼬리에 꼬리를 무는 방식으로 접근하려한다.

어떤 값을 반환해야해?

원2.점_갯수 - 원1.점_갯수 을 반환하면 돼

원이 가진 점의 갯수는 어떻게 구해?

조금 복잡한데 사실 간단한 문제야!

원을 4등분한 뒤 1쪽 면의 정수인 좌표를 구하고 4를 곱하면 돼 그 후 가운데 원이 있기 때문에 1을 더해주면 돼

두원사이의정수쌍-2.png

이미지 출처

원의 점의 갯수 구하기

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

실용주의 프로그래머 Topic 52

Topic 52 사용자를 기쁘게 하라

알고리즘 Lv2. 택배 배달과 수거하기

택배 배달과 수거하기

NCloud LB & SourcePipeline 구축하기
tech collection 서비스 성능 개선하기
Selenium 복권 구매 자동화 만들어보기
디자인 패턴
책 리뷰
블로그 챌린지