hoon's bLog

[Java] 프로그래머스 정수 제곱근 판별 자바 본문

코딩테스트/프로그래머스

[Java] 프로그래머스 정수 제곱근 판별 자바

개발한기발자 2023. 2. 8. 17:35
반응형

문제 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/12934

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

[문제 설명]

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

[제한 조건]

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

[입출력 예]

n return
121 144
3 -1

[먼저 생각해 보기]

지난 포스팅의 정수 내림차순으로 배치하기와 비슷한 맥락이다.

물론 이번엔 수학적인 접근이 더 좋아 보인다!

[나의 풀이]

class Solution {

    public long solution(long n) {
    
        long answer = 0;
        if (Math.floor(Math.sqrt(n)) < Math.sqrt(n))
            answer = -1;
        else
            answer = (long) Math.pow((long) Math.sqrt(n) + 1, 2);

        return answer;
    }
    
}

정수의 범위를 고려하여 역시 long return!

Java의 Math 클래스를 이용하여 제곱근 판단 및 자릿수 조절하여 연산!

위 코드에서는 floor, sqrt, pow 메서드를 사용했다!

Math 클래스를 이용하여 다양한 수학 연산들을 사용할 수 있다.

아래 표는 흔히 쓰이는 Math 클래스의 메서드들을 정리해 보았다.

(위 코드에서 사용한 메서드는 볼드체로 표시!)

 

static 타입 메소드명(타입 parameter, ...) 설명
static double random() 0.0 이상 1.0 미만의 범위에서 임의의 double형 값을 하나 생성하여 반환함.
static double abs(double a)
static double abs(float a)
static double abs(int a)
static double abs(long a)
전달된 값이 음수이면 그 값의 절댓값을 반환하며,
전달된 값이 양수이면 인수를 그대로 반환함.
static double ceil(double a) 전달된 double형 값의 소수 부분이 존재하면 소수 부분을 무조건 올리고 반환함.
static double floor(double a) 전달된 double형 값의 소수 부분이 존재하면 소수 부분을 무조건 버리고 반환함.
static long round(double a)
static int round(float a)
전달된 값을 소수점 첫째 자리에서 반올림한 정수를 반환함.
static double rint(double a) 전달된 double형 값과 가장 가까운 정수값을 double형으로 반환함.
static double max(double a, double b)
static float max(float a, float b)
static long max(long a, long b)
static int max(int a, int b)
전달된 두 값을 비교하여 큰 값을 반환함.
static double min(double a, double b)
static float min(float a, float b)
static long min(long a, long b)
static int min(int a, int b)
전달된 두 값을 비교하여 작은 값을 반환함.
static double pow(double a, double b) 전달된 두 개의 double형 값을 가지고 제곱 연산을 수행하여, ab을 반환함.
static double sqrt(double a) 전달된 double형 값의 제곱근 값을 반환함.
static double sin(double a)
static double cos(double a)
static double tan(double a)
전달된 double형 값에 해당하는 각각의 삼각 함숫값을 반환함.
static double toDegrees(double angrad) 호도법의 라디안 값을 대략적인 육십분법의 각도 값으로 변환함.
static double toRaidans(double angdeg) 육십분법의 각도 값을 대략적인 호도법의 라디안 값으로 변환함.

 

[다른 사람들의 풀이]

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

접근법은 내 방식과 같으나 처리하는 표현법이 기가 막히다...

애초에 if문을 통해 제곱수 여부를 확인한 후,

해당 숫자를 제곱연산하여 return 하고 그렇지 않을 때는 바로 -1 retrun...

같은 풀이지만 센스에 박수를 친다...

 

[정리]

개인 피셜 난이도 : ★

실무에서 종종 '왜 이렇게 어렵게 생각하냐?' 라는 말을 듣는다.

이 말인즉슨 쉬운 방법이 있음에도 혼자 어렵게 생각하여 로직이 복잡해짐을 의미한다.

물론 내가 풀이한 방식도 맞지만, 다른 사람의 풀이를 통해 더 간단하게 표현할 수 있음을 배웠다.

.... 아직도 갈길이 멀다.....

 

아 그리고 추가로, 난이도 한 개도 아까울 만큼 쉬워서 포스팅 건너뛴 문제들도 있다.

그런 문제들은 아래 내 github에서 검색하여 소스 참고하면 되겠다!

https://github.com/chrishoonS/codeTest

 

GitHub - chrishoonS/codeTest: programmers codeTest

programmers codeTest. Contribute to chrishoonS/codeTest development by creating an account on GitHub.

github.com

 

언제나 새로운 정보 공유와 잘못된 정보

비판/지적/태클은 환영입니다!

 

끝.

728x90
반응형