[Java] 정수 제곱근 판별 Lv1

Date:     Last Updated:

정수 제곱근 판별

문제 프로그래머스 FAQ 내용을 보니 카카오나 기업의 문제들은 저작권이 있으니 풀이를
github나 개인블로그에 올리지 말라고 되어 있어서 링크로 대체합니다.

출처: Programmers
정수 제곱근 판별

문제의 이해

문제의 이해 자체는 워낙 쉬운 문제라서 바로 이해가 됐는데 코드로 풀어나가는 부분을 어떻게 해야할지 고민이 많았다. sqrt와 pow를 이용하면 쉽게 풀 수 있다고 생각은 했는데 공부 중인데 sqrt와 pow를 이용하는 것이 맞는건가 라는 생각이 들어서다.

내가 생각한 풀이 방법

  1. 주어진 n의 제곱근을 구한다. Math.sqrt(n)
  2. 형변환을 통해서 구한 제곱근의 정수 부분만을 취한다. long = (long)double
  3. “제곱근 - 제곱근의 정수부분” 이 0보다 크다면 해당 제곱근은 정수가 아니다(return -1)
  4. 3번에서 제곱근이 정수일 경우 Math.pow((제곱근 + 1), 2)을 하면 원하는 결과가 나온다.

풀이

첫번째 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.lang.Math;

class Solution {
    public long solution(long n) {
        long conversionInt = 0;             //제곱근을 구해서 그 제곱근의 정수 부분만 얻기 위한 변수
        double squareRoot = Math.sqrt(n);   //주어진 n의 제곱근을 구함
        
        conversionInt = (long)squareRoot;   //구한 제곱근의 정수 부분만 변수에 저장
        
        
        //아래에서 설명한대로 구한 제곱근과 그 제곱근의 정수 부분만 저장한 변수를 빼면
        //해당 제곱근이 정수가 아니라면 0.xxx값이 나올테니 0보다 크므로 주어진 n은 양의 정수 x를 가진 수가 아니므로 -1리턴
        if ((squareRoot - (double)conversionInt) > 0)    
        {
            return -1;
        }
        
        //위에서 조건 검사를 끝냈기 때문에 이 부분의 코드까지 실행이 되었다면
        //주어진 n의 제곱근은 정수이기 때문에 위에서 구한 제곱근을 +1해서 제곱해주면 정답이 나옴.
        long answer = (long)Math.pow((squareRoot + 1), 2);
        
        return answer;
    }
}

//어떠한 수의 제곱근을 구함(이때는 꼭 정수가 나오지 않음)
//구한 값을 int로 형 변환해서 저장
//그러면 소수점 윗 부분만 저장이 됨.
//int형식으로 저장된 것과 구한 제곱근을 - 시켜서 그 값이 0보다 크면 그건 정수가 아니므로
//-리턴 하면 됨

//다 좋은데 너무 math에 있는 함수들만 써서 공부하는 사람 입장에서는 좋지 않은 행동인듯.


Leave a comment