문제 링크
BinaryGap
문제 요약
주어진 양의 정수를 이진수로 변경한 뒤 양쪽 끝이 1로 둘러쌓인 연속적인 0의 개수를 구하는 것
예를들어 십진수 9의 경우 이진수 1001로 표현하는데 이 때 BinaryGap은 2가 됨
하지만 십진수 15의 경우 이진수 1111로 표현되므로 BinaryGap을 갖고있지 않음
요구사항
양의 정수 N이 주어졌을 때 BinaryGap의 Max 값을 구하라
import Foundation
import Glibc
// you can write to stdout for debugging purposes, e.g.
// print("this is a debug message")
public func solution(_ N : Int) -> Int {
var a: Int = N
var number: Int = N
var b: Int
var arr = [Int]()
var numberOfMax = [Int]()
var isNumberOne: Bool = false
var zero = [Int]()
while(true) {
a = number/2
b = number%2
number = a
arr.append(b) //10011
if(number == 0) {
break
}
}
func reverse(_ arr: [Int]) -> [Int] {
return arr.reversed()
}
arr = reverse(arr) //1,1,0,0,1
for character in arr {
if character == 1 {
isNumberOne = true
} else {
isNumberOne = false
zero.append(character)
}
if isNumberOne == true {
numberOfMax.append(zero.count)
zero = []
}
}
return numberOfMax.max()!
}
이거 푸는데 한시간이나 걸리다니...
근데 십진수 -> 이진수로 변경하는 방법 있을 거 같아서 검색해봤다
decimal to binary
let decimal: Int = 30 let binary: String = String(decimal, radix: 2) print(binary) /* 11110 */
binary to decimal
let binary: String = "11011" let decimal: Int = Int(binary, radix: 2)! print(decimal) /* 27 */
역시 존재해서,,, 코드를 더 줄여봤다
import Foundation
import Glibc
public func solution(_ N : Int) -> Int {
var numberOfMax = [Int]()
var isNumberOne: Bool = false
var zero = ""
let binaryString = String(N, radix: 2)
binaryString.forEach {
if $0 == "1" {
isNumberOne = true
} else {
isNumberOne = false
zero.append($0)
}
if isNumberOne == true {
numberOfMax.append(zero.count)
zero = ""
}
}
return numberOfMax.max()!
}