두 원 사이의 정수 쌍
x축과 y축으로 이루어진 2차원 직교 좌표계에 중심이 원점인 서로 다른 크기의 원이 두 개 주어집니다. 반지름을 나타내는 두 정수 r1
, r2
가 매개변수로 주어질 때, 두 원 사이의 공간에 x좌표와 y좌표가 모두 정수인 점의 개수를 return하도록 solution 함수를 완성해주세요.
※ 각 원 위의 점도 포함하여 셉니다.
그림과 같이 정수 쌍으로 이루어진 점은 총 20개 입니다.
https://school.programmers.co.kr/learn/courses/30/lessons/181187
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class Main {
public static void main(String[] args) {
int r1 = 2;
int r2 = 3;
var reuslt = solution(r1, r2);
System.out.println(reuslt);
}
public static long solution_(int r1, int r2) {
int total = (r2 + 1) * (r2 + 1);
int lineDot = r2 - r1 + 1;
int count = 0;
for (int i = r2; i > -1; i--) {
System.out.print(i + " : ");
for (int x = 0; x <= r2; x++) {
if (r2 * r2 >= i * i + x * x) {
System.out.print("O ");
} else {
System.out.print("X ");
count++;
}
}
System.out.println();
}
System.out.println();
System.out.println();
for (int i = r1; i > -1; i--) {
System.out.print(i + " : ");
for (int x = 0; x <= r1; x++) {
if (r1 * r1 > i * i + x * x) {
System.out.print("X ");
count++;
} else {
System.out.print("O ");
}
}
System.out.println();
}
System.out.println();
System.out.println(total);
System.out.println(count);
System.out.println(lineDot);
return (total - count - lineDot) * 4;
}
}
시간초과... ㅠㅠ
public class Main {
public static void main(String[] args) {
int r1 = 2;
int r2 = 3;
var reuslt = solution(r1, r2);
System.out.println(reuslt);
}
public static long solution(int r1, int r2) {
long answer = 0;
// 4개의 사분면 중 1개만 구한뒤 4를 곱한다.
for( int i = 1; i <= r2 ; i++){
double y2 = Math.sqrt(Math.pow(r2,2) - Math.pow(i,2));
double y1 = Math.sqrt(Math.pow(r1,2) - Math.pow(i,2));
answer += ( (long)y2 - (long)Math.ceil(y1) + 1);
}
answer *= 4;
return answer;
}
}