공부/프로그래머스

[프로그래머스 Lv. 1] 정수 제곱근 판별 - JAVA

해니0 2024. 8. 9. 08:00

문제

임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.

class Solution {
    public long solution(long n) {
        long answer = 0;
        return answer;
    }
}

 

제한사항

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

 

입출력 예

n return
121 144
3 -1

 

입출력 예 설명
입출력 예#1
121은 양의 정수 11의 제곱이므로, (11+1)를 제곱한 144를 리턴합니다.

입출력 예#2
3은 양의 정수의 제곱이 아니므로, -1을 리턴합니다.

 


문제 풀이

분석

제곱근인지 판단하는 방법

 

sqrt

Java에서 Math.sqrt() 메서드를 사용하여 제곱근을 계산

이 메서드는 double 타입의 값을 반환함

 

주요 Math 메서드

제곱근 계산 주어진 숫자의 제곱근을 계산 Math.sqrt(16)은 4.0을 반환
거듭제곱 a의 b 제곱을 계산 Math.pow(2, 3)은 8.0을 반환
절댓값 주어진 숫자의 절댓값을 반환 Math.abs(-5)은 5를 반환
최대값과 최소값 두 값 중 최대값 또는 최소값을 반환 Math.max(3, 5)는 5를 반환하고, Math.min(3, 5)는 3을 반환
랜덤 숫자 생성  0.0 (포함)에서 1.0 (미포함) 사이의 랜덤 double 값을 반환 Math.random()은 0.3456789와 같은 랜덤한 값이 반환
삼각 함수  주어진 각도를 라디안으로 받아 삼각 함수를 계산 Math.sin(Math.PI / 2)는 1.0을 반환

 

 

내 소스 코드

1.java 메서드 활용

java 메서드 Math.sqrt(num)는 주어진 숫자의 제곱급을 double 타입으로 반환함

class Solution {
    public long solution(long n) {
        long sqrt = (long) Math.sqrt(n); // 제곱근을 구하고 long으로 형 변환

        // 제곱근의 제곱이 n과 같다면 다음 제곱수를 반환
        if (sqrt * sqrt == n) {
            return (sqrt + 1) * (sqrt + 1);
        }

        // 제곱수가 아니면 -1 반환
        return -1;
    }
}

 

2.수학적으로 구현

class Solution {
    public long solution(long n) {
        // 1부터 시작하여 제곱이 n과 같은 숫자를 찾기
        for (long i = 1; i * i <= n; i++) {  // i를 long 타입으로 변경하여 범위 내에서 정확히 계산
            if (i * i == n) {
                return (i + 1) * (i + 1);  // 다음 제곱수를 반환
            }
        }
        return -1;  // n이 완전 제곱수가 아닐 경우 -1 반환
    }
}

 

다른 예시 1

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;
  }
}

 

다른 예시 2

class Solution {
  public long solution(long n) {
      if(n==1){
          return 4;
      }
      for(long i=2;i<n;i++){
          if(n/i == i && n%i ==0){
              return (i+1)*(i+1);
          }
      }
      return -1;
  }
}

 

 

추가로 고민 할 부분

함수를 사용해야 점수가 높게 나온다.

하지만 수학적인 부분도 알아야 하는게 맞는것 같다

java Math 메서드에 대해 공부할 수 있었음


Lv.1  / Java / 연습문제

출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges