시간 초과 코드
public static long solution(int k, int d) {
long answer = 0;
double de = d * d;
for (int a = 0; a <= d; a++) {
for (int b = 0; b <= d; b++) {
int x = a * k;
int y = b * k;
if ((x * x) + (y * y) > de) {
continue;
}
answer++;
}
}
return answer;
}
피타고라스 정리를 이용한 2중 for문 이라 시간 초과 이다. 범위가 엄청 크다 이제보니
lv.2가 순순히 될리가 없구나. 다른 분들의 코드를 보니까 for문 한짝만으로도 가능하다
b^2=c^2-a^2 의 식으로 구하면 되니까. 다들 나빼고 참 천재라는 생각이 든다
왜 이런생각을 못하지?
그러나 나는 또 한번 더 난관에 봉착한다
//1차 시도
answer += Math.sqrt((d * d) - (a * a)) / k + 1;
//2차 시도
answer += (long) Math.sqrt((d * d) - (a * a)) / k + 1;
//3차 시도
answer += (long) Math.sqrt((long)(d * d) - (long)(a * a)) / k + 1;
그런데 d * d와 a * a를 Math.pow로 바꾸자 귀신같이 된다
왜냐하면 d * d를 할 경우 int형으로 인식 하였기 때문이다.
// d = 1000000 일때
System.out.println(d * d); // -727379968
System.out.println(Math.pow(d,2)); // 1.0E12
int 형 메모리 초과가 나서 값이 다른 값으로 뜨게 되어 정확성 테스트 값들이 틀려버립니다