1 배운내용
1)알고리즘코드카타
정수제곱근판별
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
제한사항
n은 1이상 , 50000000000000 이하인 양의 정수입니다.
입출력 예 n -121, 3 리턴- 144,-1
초기코드
class Solution {
fun solution(n: Long): Long {
var answer: Long = 0
return answer
}
}
모르겠다. 그래서 구글에서 검색했다.
블로그 참고한 부분이다.
이해
양의 정수 n 이
임이의 수의 제곱인지 판단
제곱 -> x+1의 제곱
제곱X -> -1
접근
- sqrt 사용, 형식 맞추기
- 제곱근 확인 후 Return
풀이
class Solution {
fun solution(n: Long): Long {
val a = sqrt(n.toDouble()).toLong()
return if (a * a == n) (a + 1)*(a + 1) else -1
}
}
다른사람의 풀이
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 {
-1L
}
}
}
모르는 함수다. 그래도 문제를 공부하다보면 들어는 본, 한번 보기는한 함수와 단어들이 되겠지...?
✔️ 코드 해석
val sqrt = sqrt(n.toDouble())
- math 패키지를 import하여 sqrt()를 사용한다.
- sqrt()는 제곱근을 리턴하는 메서드이다.
- 해당 메서드는 double형의 변수나 실수만 가능하다.
if(sqrt % 1.0 == 0.0){
return (sqrt + 1).pow(2.0).toLong()
} else {
return -1L
}
- n의 제곱근을 1.0으로 나눴을 때 나머지가 0.0이면 제곱근 + 1하여 제곱을 구한다.
- pow(n : Int)
- n만큼 제곱한다.
- Double형으로 반환된다.
- pow(n : Int)
- Double형으로 반환된 수를 Long 타입으로 변환한다.
- 1로 나누어지지 않는 수(나머지가 소수)라면 -1을 리턴한다.
의식의 흐름
1. kotlin.math.* 임포트 해야 쉽게 구할 수 있을 것 같다
해결 코드
import kotlin.math.*
class Solution {
fun solution(n: Long): Long {
val x = sqrt(n.toDouble()).toLong()
return when (x * x) {
n -> (x + 1) * (x + 1)
else -> -1L
}
}
}
음.. 조금 더 간단히?
import kotlin.math.*
class Solution {
fun solution(n: Long): Long {
val a = sqrt(n.toDouble()).toLong()
return if (a * a == n) (a + 1) * (a + 1) else -1L
}
}
* Math 함수 몇개 짚고가기
* 인자와 리턴 모두 Double임
1) 4의 제곱근 = sqrt(4.0) = 2.0
2) 4의 제곱 = (4.0).pow(2) = 16.0
3) 4의 세제곱 = (4.0).pow(3) = 64.0
4) 피타고라스로 대각선 길이 구하는 경우 hypot(3.0, 4.0) = 5.0
-
5) ceil(4.5) = 5 (올림)
6) floor(4.5) = 4 (내림)
7) round(4.51) = 5 (반올림)
7) abs(-3) = 3 (절대값)
8) max, min 은 쉬워서 생략

num변수를 만들어 sqrt()메소드를 사용한 이유는
sqrt()안의 파라미터를 Double이나 Float형으로만 삽입해야 되기 때문이었다.
따라서, sqrt() 메소드를 사용해 제곱근을 구했다.
테스트를 해보니 테스트 케이스 2번같이 3의 제곱근을 구하기 위해 sqrt()메소드를 실행하면
실제 그 제곱근을 리턴해주었다.
따라서, 이 때 리턴 값은 1.xxx가 나오는데 이를 어떻게 필터링할까 고민해보았다.
먼저 이 값은 Double형이고, 홀짝을 구분할 때 나머지 연산자를 사용하는 것을 먼저 떠올렸다.
그래서 어떤 값을 나머지 연산자를 사용하면 이 tempAnswer 변수가 정수인지 판단할까 고민했다.
tempAnswer 변수를 1로 나눈 나머지가 0.0이면 정수일 것이고 아니라면 소수점 아래 숫자가 있는 실수형일 것이다.
결국 나머지 연산을 한 결과가 실수형일 경우 -1을 리턴하고
아니라면 제곱근 + 1의 제곱을 리턴해야 했는데, 리턴하기 전에 문제에서 요구하는 리턴 타입은 Long 타입이었기 때문에
리턴될 answer 변수에 toLong() 메소드를 실행한 결과를 대입했다.
정답
class Solution {
fun solution(n: Long): Long {
val sqrt = kotlin.math.sqrt(n.toDouble()).toLong()
return if(sqrt * sqrt == n) (sqrt + 1) * (sqrt + 1)
else -1
}
}
import kotlin.math.floor
import kotlin.math.sqrt
class Solution {
fun solution(n: Long): Long {
val x = sqrt(n.toDouble())
return (if (x == floor(x)) ((x + 1) * (x + 1)).toLong() else -1L)
}
}
mport kotlin.math.sqrt
class Solution {
fun solution(n: Long): Long {
val a = sqrt(n.toDouble()).toLong()
return if (a * a == n) (a + 1) * (a + 1) else -1
}
}
2. 과제생각, api, erd, 구현
TODO API작성과 ERD는 그렸다
코드 구현은.. 고민을 많이 해야 될 것 같다..
'개발일지' 카테고리의 다른 글
| 2024.01.02 TIL (0) | 2024.01.02 |
|---|---|
| 23023.12.29 TIL (0) | 2023.12.29 |
| 2023.12.27 TIL (0) | 2023.12.27 |
| 2023.12.26 TIL (1) | 2023.12.26 |
| 2023.12.22 TIL (1) | 2023.12.22 |