CASE (정수 제곱근 판별)
임의의 양의 정수 n에 대해 n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고,
n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
제한 사항
- n은 1이상, 50000000000000 이하인 양의 정수입니다.
내가 풀어본 문제 풀이
import kotlin.math.sqrt
class Solution {
fun solution(n: Long): Long {
var i = sqrt(n.toDouble()).toLong()
if(i*i == n) {
return (i+1)*(i+1)
} else {
return -1
}
}
}
문제를 풀기 전 어떻게 풀어나갈지 그려보다가 n이 양의 정수 i의 제곱이라면, i를 어떻게 변수로 정의해야 할지 고민이 많았다.
제곱근 관련 함수를 알고 있는 것이 없어 다른 문제부터 해결해 나갔는데,
if 문을 활용 i의 제곱이 n일 때 (i+1)을 제곱하고, 아닐 경우 -1 을 리턴하면 되는데,
구글에 코틀린 제곱근을 정의하는 함수 sqrt가 있어 적용해 보았다.
코틀린의 수학 함수를 쓰기 위해서 import kotlin.math.sqrt (*을 sqrt 대신 사용할 경우 모든 수학 함수를 불러올 수 있다.)
제곱근 함수 sqrt를 쓰기 위해서 toDouble 활용 자료형 변환하여 n을 제곱근 하고 다시 원래의 자료형 toLong으로 변환
이후 if 식에 적용하면 정답.
다른 사람 풀이
import kotlin.math.*
class Solution {
fun solution(n: Long): Long {
val sqrt = sqrt(n.toDouble())
return if(sqrt % 1.0 == 0.0) {
(sqrt + 1).pow(2.0).toLong()
} else {
-1
}
}
}
pow 함수에 대해 알아야 해당 문제가 잘 이해가 갈텐데 밑에 sqrt 함수와 함께 자세히 설명하려 한다!
내가 풀어본 풀이와 비슷하나,
변수 sqrt 를 Long 자료형으로 변환하지 않고, if 문 내 Double 타입의 sqrt를 1.0으로 나눌 경우 n이 sqrt 변수의 제곱근일 때 나머지가 0일 테니 조건문으로 활용
다음과 같이 풀이가 나온다.
pow / sqrt
[pow]
Kotlin에서 kotlin.math 패키지의 pow 연산을 쓰면 제곱 연산이 가능하다.
pow연산은 Double, Float두가지 자료형에 대해 지원된다.
* Double 자료형은 Double이나 Int를 인자로 받아 제곱 연산(pow)을 수행할 수 있으며 반환 자료형은 모두 Double이다.
아래 예시를 참고할 수 있다.
println(3.0.pow(3.0)) // 27.0 출력
println(3.0.pow(3)) // 27.0 출력
만약 Int 자료형을 제곱 연산하고 싶다면, .toDouble을 사용 Double 타입으로 형변환 후 제곱을 수행하면 된다.
[sqrt]
Kotlin에서 제곱근 연산을 하는 방법은 sqrt 함수를 사용하면 된다.
sqrt는 square root의 축약어로 인자로는 pow와 동일하게 Double이나 Float을 받는다.
아래 예시를 참고할 수 있다.
println(sqrt(144.0)) // 12.0 출력
* 제곱(pow) 연산을 활용해 제곱근을 구할 수도 있는데, 1/2 제곱 연산을 수행하면 제곱근을 구할 수 있다.
아래 예시를 참고할 수 있다.
import kotlin.math.*
fun main() {
val int = 16
val sqrt = int.toDouble().pow(1.0 / 2.0) // 4.0
}