문제 설명
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
제한 사항
입출력 예
n
|
return
|
121
|
144
|
3
|
-1
|
입출력 예 설명
입출력 예#1
121은 양의 정수 11의 제곱이므로, (11+1)를 제곱한 144를 리턴합니다.
입출력 예#2
3은 양의 정수의 제곱이 아니므로, -1을 리턴합니다.
가장 먼저 x의 제곱수인지 판단하기 위해서
if( Math.sqrt(n) % 1 == 0)
함수를 통해 제곱인지를 확인하다.
Math.sqrt(n)을 통해 제곱근을 구하고 그 수가 정수인지 확인하기 위해
1로 나누어 나머지가 0이 나오는지를 확인하였다.
그리고 조건들을 다 넣어주어 코드를 완성시켜보면
class Solution {
public long solution(long n) {
long answer = 0;
if(1 <= n && n <= 50000000000000) {
if(Math.sqrt(n) % 1 == 0) {
answer = (Math.sqrt(n) + 1) ** 2;
}
else{
answer = -1;
}
}
return answer;
}
}
이렇게 나온다.
이 코드로 실행을 해보면 runtime error가 나온다.
가장 첫번째 문제는 범위였다.
범위가 너무 크기 때문에 50000000000000 숫자 옆에 Long의 약자 L을 붙여줘야 한다.
그리고 두번째 자바를 오랫만에 하여 헷갈렸는데 제곱을 할 때 ** 이 아니라
그대로 한번 더 곱해줘야 했다.
마지막으로 Math.sqrt(n) 은 double 형을 반환한다.
이대로 계산을 다 하면 answer = double형의 값을 넣어야하는데
처음에 answer를 long으로 초기화했기 때문에 long으로 형변환을 해준다.
따라서 이 모든 것을 넣어서 다시 짜보면
class Solution {
public long solution(long n) {
long answer = 0;
if(1 <= n && n <= 50000000000000L) {
if(Math.sqrt(n) % 1 == 0) {
answer = (long)(Math.sqrt(n) + 1) * (long)(Math.sqrt(n) + 1);
}
else{
answer = -1;
}
}
return answer;
}
}
이렇게 된다.
다른 사람들의 풀이 중에 가장 좋아요 수가 높았던 코드를 보면 매우 효율적임을 볼 수 있다.
class Solution {
public long solution(long n) {
if (Math.pow((int)Math.sqrt(n), 2) == n) {
return (long) Math.pow(Math.sqrt(n) + 1, 2);
}
return -1;
}
}
n의 제곱근을 구하고 다시 제곱을 하는데 (int)형으로 변환하여 소수점 자리를 버린다.
그 결과 원래 n과 같은지 확인하게 되면 정수인지 판별할 수 있다.
그리고 Math.pow 함수로 제곱을 하면 된다.
형변환의 중요성과 제곱 함수가 Math.pow인지 새롭게 알아갈 수 있었다.
[Java] 서울에서 김서방 찾기 (1) | 2025.01.20 |
---|---|
[Java] 두 정수 사이의 합 (3) | 2025.01.16 |
[Java] 자리수의 합으로 하샤드 수 판별하기 (2) | 2025.01.15 |
[Java] 정수 내림차순으로 배치하기 (1) | 2025.01.14 |
[Java] 문자열을 정수로 바꾸기 (0) | 2025.01.13 |