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
'알고리즘' 카테고리의 다른 글
[프로그래머스 요격 시스템] - 파이썬 풀이 (0) | 2024.06.23 |
---|---|
[프로그래머스 보석 쇼핑] - 파이썬 풀이 (0) | 2023.06.02 |
[프로그래머스 불량 사용자] 파이썬 풀이 (0) | 2023.06.01 |
[백준 15686 치킨 배달] - 파이썬 풀이 (골드 5) (0) | 2023.05.22 |
[프로그래머스 프렌즈4블록] - 파이썬 풀이 (0) | 2023.05.17 |