// 규칙을 찾으면 간단한 문제입니다
// 1. 2진수로 변환시 모든 숫자가 1인경우 젤 앞에 1을 붙히고 뒷 숫자를 0으로 변환
// 2. 2진수로 변환시 젤 뒷 숫자가 0인 경우 0을 1로 변경
// 3. 1,2번 조건이 아닐때 0이 나오면 0을 1로 바꾸고 뒷 숫자를 0으로 변경
func solution(_ numbers:[Int64]) -> [Int64] {
var numArray = [String]()
var answer = [Int64]()
func check (_ n: String) -> Int64 {
var n = n.map{String($0)}
var answer = Int64(0)
// 2번 규칙
if n.last == "0" {
n.removeLast()
n.append("1")
var a = ""
for i in n {
a.append(i)
}
return Int64(a, radix: 2)!
// 1번 규칙
} else if !n.contains("0") {
n[0] = "0"
n.insert("1", at: 0)
var a = ""
for i in n {
a.append(i)
}
return Int64(a, radix: 2)!
// 3번 규칙
} else {
for i in (0..<n.count-1).reversed() {
if n[i] == "0" {
n[i] = "1"
n[i+1] = "0"
var a = ""
for i in n {
a.append(i)
}
return Int64(a, radix: 2)!
}
}
}
return answer
}
// 모든 수를 2진수로 변환
for i in numbers {
numArray.append(String(i, radix:2))
}
for i in numArray {
answer.append(check(i))
}
return answer
}