문제
https://school.programmers.co.kr/learn/courses/30/lessons/181187
풀이(30분)
import java.util.*;
class Solution {
public long solution(int r1, int r2) {
long answer = 0;
double powR1 = Math.pow(r1, 2);
double powR2 = Math.pow(r2, 2);
int onLine = (r2 - r1 + 1)*4; //선 위에 있는 좌표 개수
for(int i=0; i<= r2; i++){ //1사분면만 계산
double powX = Math.pow(i, 2);
if(i > r1) powR1 = 0;
double y1 =0;
if(powR1 != 0){
y1 = Math.sqrt(powR1 - powX); // 작은 원에 대한 점
if(y1 > Math.floor(y1)){
y1 = Math.ceil(y1);
}
}
double y2 = Math.sqrt(powR2 - powX); // 큰 원에 대한 점
if(y2 > Math.floor(y2)){
y2 = Math.floor(y2);
}
answer += (int)y2 - (int)y1 + 1;
}
return answer*4 - onLine; //중복된 부분을 제거
}
}
계산은 1사분면에 대한 것만 하고 중복된 점을 제외한다는 것에 초점을 두었다.
식 자체는 수학에 대한 연산일 뿐 딱히 어려운 부분은 없었다.
원을 여러개 그리면서 기존에 배운 수식을 떠올린다면 크게 어렵지는 않은 문제였다.
다만 그 과정이 오래걸렸다 ㅠ
'문제 풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 연도별 대장균 크기의 편차 구하기(SQL) (1) | 2024.11.21 |
---|---|
[프로그래머스] 석유 시추(JAVA) (1) | 2024.11.21 |
[프로그래머스] 진료과별 총 예약 횟수 출력하기(SQL) (0) | 2024.11.20 |
[프로그래머스] 12세 이하인 여자 환자 목록 출력하기(SQL) (2) | 2024.11.19 |
[프로그래머스] 퍼즐 게임 챌린지(JAVA) (0) | 2024.11.19 |