적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Algorithm/Programmers

[Swift 알고리즘] Programmers 정수 제곱근 판별

hongssup_ 2022. 1. 12. 23:03
반응형

Level 1 연습문제

정수 제곱근 판별

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

 

입출력 예시

print(solution(121)) //144
print(solution(3)) //-1

내답안

func solution(_ n:Int64) -> Int64 {
    for i in 1...n {
        if i*i == n { return (i+1)*(i+1) }
        if n < i*i { return -1 }
    }
    return 0
}

i 가 n까지 갈 일은 없으니까 어짜피 그전에 리턴을 해버릴거니까 i += 1 하기 귀찮아서 그냥 for문으로 돌려버렸는데, 의미없는 n까지 반복문을 돌리는게 좋은 방법은 아니란걸 안다. 리턴 경우의 수가 세가지나 되는 것도 별로고..

이를 보완해 다음과 같이 만들어주니 훨씬 간결하고 좋은 것 같다. while true 가 아니라 i*i < n 일때까지 i++ 해주고 그다음에 바로 리턴해버리니 if문도 안써도 되고 아주 간결하고 좋아보인다.  

 

보완답안

func solution(_ n:Int64) -> Int64 {
    var i:Int64 = 1
    while i*i < n {
        i += 1
    }
    return (i*i == n) ? (i+1)*(i+1) : -1
}

sqrt 사용답안

import Foundation
func solution(_ n:Int64) -> Int64 {
    let t = Int64(sqrt(Double(n)))
    return t * t == n ? (t+1)*(t+1) : -1
}

sqrt : Returns the square root of each element in a vector.

squareRoot()

728x90
반응형