Swift | programmers/Lv1.
[Swift]Lv.1 정수 제곱근 판별
iOSDEv
2024. 2. 23. 10:35
정수 제곱근 판별
문제

나의 풀이

sqrt 제곱근 함수를 사용해서 풀었다
다른 사람의 풀이
extension Int64 {
func bitCount() -> Int {
let hexString = String(self, radix: 2, uppercase: false)
return hexString.count
}
}
func solution(_ n:Int64) -> Int64 {
let sqrtBitCount: Int = (n.bitCount() + 1) / 2
let min, max: Int64
min = 1 << Int(sqrtBitCount - 1)
max = 1 << sqrtBitCount
for i in min..<max {
if i * i == n {
return (i + 1) * (i + 1)
} else if i * i > n {
break
}
}
return -1
}
2진수로 변환한 후 비트에 1을 더하고 2를 나눈 후 결과를 저장한다
그리고 min, max 비트 단위 왼쪽 시프트(<<)를 사용해서
최솟값은 1을 잡고 sqrtBitcount - 1 만큼 왼쪽으로 옮기는 것이고
최댓값은 1을 잡고 sqrtBitcount 만큼 왼쪽으로 옮긴다
그렇게 min - max 범위까지 반복해서 제곱근이 n과 같은지 판별하고 만약 n보다 크다면 반복문을 종료
여기서 내가 처음 보는 것들이 있어서 정리하고자 한다
let binaryString = String(10, radix: 2, uppercase: false)
print(binaryString) // 출력: "1010"
//10을 2진수로 변환하여 문자열 1010을 생성한다
//Int64 -> 정수2진수 문자열로 변환하고 그 문자열의 길이를 반환하여 해당 정수의 비트 수를 계산하는데 활용
String(10진수, radix: 진수, uppercase: 문자열 대문자 소문자 여부)
- 10 : 현재 인스턴스 (메소드가 호출된 인스턴스) 나타냄 원 숫자
- radix : 변경할 진수 만약 2이면 2진수 8이면 8진수를 변경할것이라고 생각하면된다
- uppercase : 문자열로 반환하기 때문에 대문자로 변환할것인지 아닌지에 대해서 작성한다
func solution(_ n:Int64) -> Int64 {
let doubleValue: Double = Double(n).squareRoot()
var intValue: Int = Int(doubleValue)
if (Double(intValue) == doubleValue) {
intValue += 1
return Int64(intValue*intValue)
} else {
return -1
}
}
squareRoot()에 대해서 처음 들어봤기에 정리하고자 한다
- squareRoot란?
- 부동 소수점 수에 대해 제곱근을 계산하게된다 (sqrt와 똑같다고 생각)
func solution(_ n:Int64) -> Int64 {
var count: Int64 = 0
var ans: Int64 = 0
while count * count < n {
count += 1
}
if count * count == n {
ans = (count + 1) * (count + 1)
} else {
ans = -1
}
return ans
}
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr