반응형

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

 

문제는 이렇다.

 

 

 

 

** Javascript

 

 

내 풀이는 이렇다.

 

function solution(n) {
    const sqrt = Math.sqrt(n) % 1 === 0 ? Math.sqrt(n) : -1;
    return sqrt === -1 ? sqrt : Math.pow(sqrt + 1, 2);
}

 

 

사실 온전한 내 실력으로 풀지는 않았고 루트를 씌웠을 때 결과값이 정수인지 아닌지 가리는 방법을 갓택오버플로우에서 찾았다.

 

 

https://stackoverflow.com/questions/30919111/whats-the-best-way-in-javascript-to-test-if-a-given-parameter-is-a-square-numbe

 

What's the best way in JavaScript to test if a given parameter is a square number?

I created a function that will test to see if a given parameter is a square number. Read about square numbers here: https://en.wikipedia.org/?title=Square_number If the number is a square number...

stackoverflow.com

 

 

위 주소에서

 

var isSquare = function (n) {
    return Math.sqrt(n) % 1 === 0;
};

 

이 식을 활용했다. 루트 씌운 값을 1로 나눴을 때도 나머지가 없는 경우를 골라내는 것이다.

 

javascript 에서 Math.sqrt(숫자) 는 숫자에 루트를 씌운 것이고

Math.pow(숫자, 지수) 는 숫자^지수 이다.

 

 

 

 

 

(2021-08-09 추가)

 

** Java

 

 

import java.lang.Math;

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

 

 

Java 의 경우 perfect square root 를 찾는 방법을 구글링 해봤더니 아래 방법을 쓰는 방법이 나왔다

 

    static boolean checkPerfectSquare(double x)  
    { 

	// finding the square root of given number 
	double sq = Math.sqrt(x); 

	/* Math.floor() returns closest integer value, for
	 * example Math.floor of 984.1 is 984, so if the value
	 * of sq is non integer than the below expression would
	 * be non-zero.
	 */
	return ((sq - Math.floor(sq)) == 0); 
    }

출처: https://beginnersbook.com/2019/02/java-program-to-check-if-given-number-is-perfect-square/

 

 

 

Math.sqrt() 와 Math.power() 의 경우 return 타입이 double 이므로 주의해야 한다.

 

 

 

 

추천을 가장 많이 받은 풀이는 아래와 같다.

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

 

 

두 번째로 추천을 많이 받은 풀이인데 이게 가장 내 취향에 맞다.

 

class Solution {
  public long solution(long n) {

    double i = Math.sqrt(n);

    return Math.floor(i) == i ? (long) Math.pow(i + 1, 2) : -1;
  }
}

 

 

 

 

** Python

 

 

그래서 파이썬은 취향에 맞는 풀이로 작성해 보았다.

 

import math

def solution(n):
    sqrt = math.sqrt(n)
    return math.pow(sqrt + 1, 2) if math.floor(sqrt) == sqrt else -1

 

 

 

언어마다 추천을 가장 많이 받은 풀이를 찾아보면 재밌다. 상상도 못한 풀이 방법을 발견할 수 있다.

 

def nextSqure(n):
    sqrt = n ** (1/2)

    if sqrt % 1 == 0:
        return (sqrt + 1) ** 2
    return 'no'

 

 

생각해보면 1/2 제곱이 루트인데 굳이 javascript 나 java나 python이나 math 를 이용할 필요가 있었나 싶다.

허탈하다.

반응형

+ Recent posts