[Codility] 1. BinaryGap

Donghee Lee·2022년 3월 14일
0

Algorithm

목록 보기
1/17
post-thumbnail

문제 링크
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()!
}
profile
Better than Yesterday

0개의 댓글