도비LOG(跳飛錄)

도비의 AI 엔지니어 도전기

알고리즘

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

나쁜도비 2024. 6. 23. 17:18

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

 

프로그래머스

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

programmers.co.kr

 

문제 요약

반지름을 나타내는 두 정수 r1, r2가 매개변수로 주어질 때, 두 원 사이의 공간에 x좌표와 y좌표가 모두 정수인 점의 개수를 return
※ 각 원 위의 점도 포함하여 센다.

 

풀이

1. 1사분면만 고려하고 계산한 뒤 나중에 4를 곱한다.

2. x좌표를 0부터 r2까지 순회하면서,

    2.1. 각 x에 대해 r1 <= y <= r2를 만족하는 정수 y의 개수를 센다.

    2.2. y의 상한과 y의 하한을 구한다.

3. x축과 y축 상의 중복 계산되는 점들을 빼준다.

from math import ceil, floor, sqrt

def solution(r1, r2):
    count = 0
    for x in range(r2 + 1): # 0부터 r2까지 x 좌표 순회
        y_max = floor(sqrt(r2**2 - x**2)) # y좌표 최댓값 (반내림)
        y_min = 0 if x > r1 else ceil(sqrt(max(0, r1**2 - x**2))) # y좌표 최솟값 (반올림)
        count += y_max - y_min + 1 # y좌표 최댓값과 y 좌표 최솟값 사이의 차 + 1
    
    return (4 * count) - (4 * (r2 - r1 + 1)) # 사분면 모두에 대해서 계산한 뒤 중복 카운트 제거
728x90