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

김주형·2022년 10월 2일
0

알고리즘

목록 보기
9/29
post-thumbnail

출처

문제 설명

문제 설명

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

제한 사항

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

입출력 예

nreturn
121144
3-1

입출력 예 설명

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


문제 접근

  1. 임의의 양의 정수 n에 대해 n이 어떤 양의 정수 x의 제곱인지 판단해야 한다. -> n의 제곱근을 제곱을 해준 뒤의 n과 비교하면 된다.

  2. Math.sqrt(n)를 통해 제곱근을 찾는다.

  3. 1에서 찾은 제곱근을 Math.pow()를 사용하여 제곱한뒤 비교한다.

  4. n이 어떤 양의 정수 x의 제곱이라면, 1에서 찾은 제곱근에 1을 더한 후 제곱하여 리턴, 아닐 시 -1을 리턴.

class Solution {
    public long solution(long n) {
        long answer = 0;
        long sqrt = (long) Math.sqrt(n);
        if(n == Math.pow(sqrt, 2)){
            return (long) (Math.pow(sqrt+1, 2));
        }else {
            return -1;
        }
        
    }
}
  • Math.sqrt(n) : 제곱근 구하는 메서드(double형)
    ex) Math.sqrt(121); = 11
    Math.sqrt(2); = 1.414213562373095
  • Math.pow(수,제곱할 수) : 거듭 제곱 구하는 메소드 (double형)
    ex) Math.pow(12, 2); = 144

테스트 실행

test


코드 줄이기

1. 리팩토링

불필요해 보이는 변수 선언과 else문 제거하여 간결하고 효율적인 코드로 리팩토링하기

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. 다른 풀이

  • i가 내림한 결과와 i가 같다면 0.xxx가 없으므로 제곱근인 셈이므로
  • Math.floor : 실수 소수점을 내림해서 정수.0 형태의 double을 반환
class Solution {
  public long solution(long n) {

    double i = Math.sqrt(n);

    return Math.floor(i) == i ? (long) Math.pow(i + 1, 2) : -1;
  }
}
profile
근면성실

0개의 댓글