상세 컨텐츠

본문 제목

[Java] 정수 제곱근 판별

코딩뿌시기(연습)

by thisnorm 2025. 1. 13. 18:17

본문

 

문제 설명

임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.

n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.

 

제한 사항

  • n은 1이상, 50000000000000 이하인 양의 정수입니다.

 

입출력 예

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
셀 전체 선택
열 너비 조절
행 높이 조절
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인지 새롭게 알아갈 수 있었다.

 

관련글 더보기