will come true

[프로그래머스 / Level1] 정수 제곱근 판별 (Java) 본문

Algorithm

[프로그래머스 / Level1] 정수 제곱근 판별 (Java)

haehyun 2021. 10. 25. 18:04
728x90

문제

https://programmers.co.kr/learn/courses/30/lessons/12934

 

코딩테스트 연습 - 정수 제곱근 판별

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

programmers.co.kr

 

기존 코드 (성공)

class Solution {
    public long solution(long n) {
        long answer = -1;
        
        for(long i=1; i*i <= n; i++){
            if(i*i == n){
                answer = (i+1)*(i+1);
                break;
            }
        }
        
        return answer;
    }
}

- 제곱근을 구하는 코드라는 점이 한눈에 파악되지 않으며, Java 라이브러리를 활용하지 못함.
- 제곱했을때(자신과 자신을 곱했을 때) n과 같은 수를 찾을 때까지 불필요한 연산을 반복하기 때문에 경제적이지 못하며, i*i<=n이라는 for문 수행 범위 또한 넓은 감이 있음.

 

학습 내용

Math 클래스

java.lang 패키지에 포함된 클래스로, 수학 관련 작업을 위한 메서드와 상수를 제공한다.

파일탐색기로 C:\Program Files\Java\jdk{version} 경로에 있는 'src.zip' 압축파일을 해제한 뒤,
java > lang 패키지 경로를 따라가면 Math클래스의 소스코드를 확인할 수 있다.

Math.java

Math 클래스 상수

상수 설명
E 자연 로그의 밑 (2.7182818284590452354)
PI 원주율 (3.14159265358979323846)

 

Math 클래스 메서드 (일부)

메서드 설명
double sin(double a)
double cos(double a)
double tan(double a)
삼각함수
double toRadians(double angdeg)
double toDegrees(double angrad)
Radian - Degree 각도 단위 변환
int max(int a, int b)
int min(ing a, int b)
둘 중 큰/작은 값 반환
int round(float a) 소수점 첫번째 자리에서 반올림
double ceil(double a) 올림
double floor(double a) 내림
double log(double a) 자연로그 계산
double random() 0.0~1.0 사이 난수 값
int abs(int a) 절대값
double sqrt(double a) a의 제곱근 (제곱하면 a가 되는 수)     ex) sqrt(9) = 3
double pow(double a, double b) a의 b제곱    ex) pow(2, 3) = 2^3 = 8
double exp(double a) e의 거듭제곱

*대부분 매개변수(int, long, float, double)에 따라 오버로딩 되어 있음. 위 표에서는 대표 타입 하나만을 기재
*sqrt = square root(제곱근)
*pow = power(거듭제곱)

 

개선 코드 (성공)

import java.lang.Math;

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;
    }
}
import java.lang.Math;

class Solution {
    public long solution(long n) {
        return (Math.pow((int)Math.sqrt(n), 2) == n) ? (long)Math.pow(Math.sqrt(n) + 1, 2) : -1;
    }
}

- 제곱/제곱근 연산에 Math클래스의 sqrt(), pow() 메서드를 활용
- Math.sqrt() 메서드 반환값은 double인데, 매개변수로 받은 정수형 long변수와 일치하는지 확인해야하기 때문에 int로 형변환 해준 뒤 비교한다.
- int의 제곱은 반드시 int기 때문에 비교과정에서 pow메소드 반환값에 대한 형변환은 필요없으나, 해당 메서드의 반환값(return)은 long타입이어야 하기 때문에 마지막 return에서는 long형변환을 필수로 해야함.

728x90
Comments