프로그래머스 140107 점 찍기 JAVA

sundays·2022년 12월 6일
0

문제

점 찍기

풀이

시간 초과 코드

	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 형 메모리 초과가 나서 값이 다른 값으로 뜨게 되어 정확성 테스트 값들이 틀려버립니다

전체 코드

전체 코드

profile
develop life

0개의 댓글