/ ALGORITHM

제곱수 판별하기

Algorithm 관련 포스팅

이 글은 프로그래머스의 제곱수 판별하기의 풀이를 정리한 것입니다.

문제 설명

어떤 자연수를 제곱했을 때 나오는 정수를 제곱수라고 합니다. 정수 n이 매개변수로 주어질 때, n이 제곱수라면 1을 아니라면 2를 return하도록 solution 함수를 완성해주세요.


제한사항

  • 1 ≤ n ≤ 1,000,000

입출력 예

n result
144 1
976 2

입출력 예 설명

입출력 예 #1

  • 144는 12의 제곱이므로 제곱수입니다. 따라서 1을 return합니다.

입출력 예 #2

  • 976은 제곱수가 아닙니다. 따라서 2를 return합니다.

나의 풀이(1)

  • Math.sqrt(double a): double 값의 양의 제곱근 반환
  • Math.floor(double a): double 값보다 작거나 같은 정수(내림값) 반환
  • 제곱근제곱근의 내림값이 같으면 즉, 제곱근이 양의 정수이면 제곱수
    • 예시
      // 256은 제곱수임
      // 256은 제곱근인 16을 제곱한 수
      System.out.println(Math.sqrt(256));               // 16.0
      System.out.println(Math.floor(Math.sqrt(256)));   // 16.0
        
      // 6은 제곱수가 아님
      // 6의 제곱근은 정수가 아님
      System.out.println(Math.sqrt(6));                 // 2.449489742783178
      System.out.println(Math.floor(Math.sqrt(6)));     // 2.0
    
    • result
      16.0
      16.0
      2.449489742783178
      2.0
    
class Solution {
    public int solution(int n) {
        int answer = 0;
        
        // 제곱근과 제곱근의 내림값이 같으면 제곱수임
        if (Math.sqrt(n) == Math.floor(Math.sqrt(n))) answer = 1;
        else answer = 2;
        
        return answer;
    }
}

나의 풀이(2)

  1. i값이 1부터 1씩 증가하며, i를 제곱한 값이 n보다 작은 for
  2. i로 나누어 떨어지고, i로 나눈 몫이 i 인 값을 찾으면 answer를 1로 반환
class Solution {
    public int solution(int n) {
        int answer = 2;
        
        // 1.
        for (int i = 1; i*i <= n; i++) {
            
        // 2.
            if ((n % i == 0) && (n / i == i)) answer = 1;
        }
        
        return answer;
    }
}

나의 풀이(3)

  • 제곱근으로 나누어 떨어지는 수인지 판별
class Solution {
    public int solution(int n) {
        int answer = 0;
        
        // 제곱근으로 나누어 떨어지는 수는 제곱수
        if (n % Math.sqrt(n) == 0) answer = 1;
        else answer = 2;
        
        return answer;
    }
}