본문 바로가기
프로그래머스/Lv.1

정수 제곱근 판별 - JAVA, double과 long 비교

by 아찌방 2024. 5. 25.

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/12934

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

풀이 - 나의 생각

 

뒤에 소수점이 붙은걸 어떻게 알지?

 

라는 고민만 해결하면 되는 문제입니다.

 

제가 선택한 방법은

 

Double형을 long형으로 변환해서 비교하는 방법이었습니다.

 

우선 주어진 정수 n의 제곱근을 Double형으로 저장한 후

 

이것을 long형으로 변환 후 비교하면 되는 아주 간단한 방식입니다.

 

그런데 이 두가지의 차이가 뭐길래 이런 결과가 날까? 생각할 것입니다.

 

부동 소수점과 정수 변환

  1. double 타입:
    • double은 64비트 IEEE 754 부동 소수점 숫자입니다.
    • 소수 부분을 포함할 수 있으며, 매우 큰 값과 매우 작은 값을 표현할 수 있습니다.
  2. long 타입:
    • long은 64비트 정수입니다.
    • 소수 부분을 포함할 수 없으며, 정수만 표현할 수 있습니다.

 

long 타입은 이미 정수입니다.

 

double 값을 long으로 캐스팅하면 소수 부분이 버려집니다. 즉, double 값에서 정수 부분만 남게 됩니다.

 

public class Main {
    public static void main(String[] args) {
        double value = 4.26;
        long longValue = (long) value;
        
        System.out.println("Original double value: " + value); // 4.26
        System.out.println("Converted long value: " + longValue); // 4
    }
}

 

이렇게 되는 겁니다.

 

그러니까 제곱근이 X.xxxxxxx 이렇게 나왔을때

 

이것을 long 타입으로 변환하면 X.0000000이렇게 되는 겁니다.

 

그러니까

 

X.xxxxxxx == X.0000000 하면 False가 나오겠죠?

 

ps.

 

추가적으로 제가 제곱을 할때

 

Math.pow()를 쓰지 않았는데

 

그 이유는 이런 간단한 계산에서는 오히려 비효율적이기 때문입니다.

 

Math.pow는 더 복잡한 거듭 제곱 계산을 위해 유용합니다.

 

코드

 

class Solution {
    public long solution(long n) {
        long answer = -1;
        double sqrt = Math.sqrt(n);
        if(sqrt == (long)sqrt){
            sqrt++;
            answer = (long)(sqrt * sqrt);
        }
        return answer;
    }
}

 

 

 

 

 

 

 

다음에 또 봐요

 

728x90