728x90
문제
https://school.programmers.co.kr/learn/courses/30/lessons/181187
해설
r2보다 작은 모든 점을 일일히 계산하기에는 값의 범위가 너무 큽니다.
따라서 원이란 각 사분면이 서로 동일하므로 한 사분면의 개수를 구해 4배를 해주면 더 간단하게 해결 가능합니다.
이때 각 축을 주의해야하는데 저는 y축을 제외했습니다.
따라서 x축 기준으로 1~r2의 값을 확인합니다.
각 x별 큰 원과 만나는 점을 max, 작은 원과 만나는 점을 min으로 정합니다.
max는 버림을 통해 최소인 정수로, min은 올림으로 최대인 정수로 변형합니다(각 원 위의 점을 포함하기 위해)
max-min +1을 통해 두 정수 사이의 모든 정수의 수를 구해 sum에 합해주어 문제를 해결합니다.
주의점
- 각 원 위의 점도 포함하여 센다.
- 4배로 곱할 때 축이 중복되지 않도록 염두한다.
코드
class Solution {
public long solution(int r1, int r2) {
long answer = 0;
long sum=0;
// 4배를 곱해주기 위해 x가 0인 y축은 제외하고 연산
for(int x = 1;x<=r2;x++){
// 정수 범위의 최대값
long max = (long)Math.sqrt(1.0*r2*r2-1.0*x*x);
// 정수 범위의 최소값
long min = r1>x ? (long)Math.ceil(Math.sqrt(1.0*r1*r1-1.0*x*x)) : 0;
// 두 정수 사이의 정수값을 구해서 합
sum += max-min+1;
}
return 4*sum;
}
}
728x90
'[IT] 코딩테스트 > [문제 및 풀이] 프로그래머스' 카테고리의 다른 글
[프로그래머스] 과제 진행하기 / 자바(Java) (0) | 2023.10.25 |
---|---|
[프로그래머스] 리코쳇 로봇 / 자바(Java) (1) | 2023.10.20 |
[프로그래머스] 요격 시스템 / 자바(Java) (2) | 2023.10.18 |
[프로그래머스] 광물 캐기 / 자바(Java) (0) | 2023.10.17 |
[프로그래머스] 피로도 / 자바(Java) (0) | 2023.09.07 |