간단히 말해서
0을 모두 제거 -> 제거 한 후 길이를 이진법으로 변환 -> 0제거
위 과정을 s=1 이 될때까지 반복한다.
그렇게 [반복 횟수, 제거한 0의 갯수] 를 리턴하면 해결된다.
repeat - while을 통한 반복문을 통해 해결하고자 한다.
우선 String(a, radix: x) 로 x진법 숫자로 변환할 수 있다는 것을 알게 되었다.
import Foundation
func solution(_ s: String) -> [Int] {
var S = s
var count = 0
var zeroCount = 0
repeat {
count += 1
let removedZeroCount = S.filter { $0 == "0" }.count
zeroCount += removedZeroCount
S = S.replacingOccurrences(of: "0", with: "")
let c = S.count
S = String(c, radix: 2)
} while S != "1"
return [count, zeroCount]
}
물론 한번에 적어내린 것은 아니었지만 비교적 쉽게 해결한 것 같았다.
처음 문제를 풀때 구조를 파악한 후, 처음 써보는 repeat while문을 쓰기로 결정한 것이 핵심이었다.
다른사람의 풀이는
import Foundation
func solution(_ s: String) -> Array<Int> {
var copiedS = s
var removedZero = 0
var count = 0
while copiedS != "1" {
removedZero += copiedS.replacingOccurrences(of: "1", with: "").count
copiedS = String(copiedS.replacingOccurrences(of: "0", with: "").count, radix: 2)
count += 1
}
return [count, removedZero]
}
이런식으로 그냥 while문으로 해결하기도 하였다. 거의 똑같은거 같다. 그래도 repeat라는 단어가 들어있어서 복잡한 코드에서는 더 간단하게 구조를 파악할 수 있을거 같다.