https://school.programmers.co.kr/learn/courses/30/lessons/12934
풀이 - 나의 생각
뒤에 소수점이 붙은걸 어떻게 알지?
라는 고민만 해결하면 되는 문제입니다.
제가 선택한 방법은
Double형을 long형으로 변환해서 비교하는 방법이었습니다.
우선 주어진 정수 n의 제곱근을 Double형으로 저장한 후
이것을 long형으로 변환 후 비교하면 되는 아주 간단한 방식입니다.
그런데 이 두가지의 차이가 뭐길래 이런 결과가 날까? 생각할 것입니다.
부동 소수점과 정수 변환
- double 타입:
- double은 64비트 IEEE 754 부동 소수점 숫자입니다.
- 소수 부분을 포함할 수 있으며, 매우 큰 값과 매우 작은 값을 표현할 수 있습니다.
- 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
'프로그래머스 > Lv.1' 카테고리의 다른 글
프로그래머스 > 옹알이(2) - Python, re.sub() (0) | 2024.10.27 |
---|---|
코딩테스트 연습 > 대충 만든 자판 Pyton (0) | 2024.10.25 |
문자열 내 p와 y의 개수 - JAVA (0) | 2024.05.23 |
코딩테스트 연습 > 푸드 파이트 대회 - JAVA (문자열 뒤집기) (0) | 2024.02.24 |
코딩테스트 연습 > 덧칠하기 - JAVA (0) | 2024.02.23 |