thkyang324

[프로그래머스] 두 원 사이의 정수 쌍 (Python 파이썬) 본문

코딩테스트

[프로그래머스] 두 원 사이의 정수 쌍 (Python 파이썬)

thkyang324 2023. 4. 15. 14:46

두 원 사이의 정수 쌍

수학, 레벨2

https://school.programmers.co.kr/learn/courses/30/lessons/181187

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


먼저 원의 방정식 공식을 활용하여 x와 r이 주어졌을 때 y좌표를 계산하는 함수를 f라는 이름으로 만든다.

f = lambda x, r : (r**2-x**2)**0.5

원에 속하는 점의 수를 단순 수학적 계산을 통해 구할 수 있다. x**2 + y**2 = r**2 이므로, 어떠한 x에 대하여 원에 해당하는 점의 수는 int((r**2-x**2)**0.5)이다. 0사분면만 구한 후 4배하고 x, y축 위에 있는 점의 수를 더하면 된다. 이를 calc_dots 함수로 구현했다.

def calc_dots(r):
    return sum([int(f(x,r)) for x in range(1, r)])*4+4*r+1

원 위에 있는 점 또한 비슷한 방식으로 구할 수 있다. int((r**2-x**2)**0.5)를 y'라고 할 때, x**2 + y'**2 = r**2 를 만족하면 해당 위치는 원 위에 존재한다. 이를 calc_dots_in_grid 함수로 구현했다.

def calc_dots_in_grid(r):
    return sum([int(f(x,r))**2 + x**2 == r**2 for x in range(1, r)])*4 + 4

마지막으로, 두 원 사이에 있는 점은 r2위에 있는 점 - r1위에 있는 점 + r1 테두리 위에 있는 점으로 구할 수 있다.

def solution(r1, r2):
    return calc_dots(r2)-calc_dots(r1) + calc_dots_in_grid(r1)

 

최종 제출한 코드는 다음과 같다.

f = lambda x, r : (r**2-x**2)**0.5

def calc_dots(r):
    return sum([int(f(x,r)) for x in range(1, r)])*4+4*r+1

def calc_dots_in_grid(r):
    return sum([int(f(x,r))**2 + x**2 == r**2 for x in range(1, r)])*4 + 4

def solution(r1, r2):
    return calc_dots(r2)-calc_dots(r1) + calc_dots_in_grid(r1)
Comments