Swift랑 친해지기/programmers 풀기
[프로그래머스] 2개 이하로 다른 비트 (Swift) -10,11 실행초과
데브킹덕
2023. 6. 18. 17:06
https://school.programmers.co.kr/learn/courses/30/lessons/77885
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
※ numbers의 수들을 차례로 1씩 늘려서 비트를 비교하게 되면 10,11 실행초과 ※
- radix 메서드를 이용해 2진수로 변환
규칙을 찾아서 문제 해결
1. 마지막 자리비트가 0이면 1을 더함 - (10진수에 1을 더함)
ex) 10진수 2 - 0010 -> +1 -> 0011(3)
2. 모든 비트가 1일 경우 비트 맨 앞자리에 1을 삽입하고 Index 1을 0으로 변환
ex) 10진수 7 - 111 -> 1111(맨앞1추가) -> 1011(index1을 0변환) -> 10진수 - 11
3. 마지막 비트부터 접근했을때 0이 나오면 1로 바꾸고 0이나온 자리 +1번째를 0으로 변환
ex) 10진수 13 - 1101 -> 1111(0자리를 1로 바꿈) -> 1110 (+1번째 자리를 0으로 바꿈) -> 14
import Foundation
func solution(_ numbers:[Int64]) -> [Int64] {
var result = [Int64]()
for num in numbers{
var num2 = String(num, radix: 2).map{String($0)}
if num2[num2.count-1] == "0"{
result.append(num+1)
continue
}
else{
if !num2.contains("0"){
num2.insert("1", at: 0)
num2[1] = "0"
let num2Str = num2.reduce("", {$0 + $1})
result.append(Int64(num2Str,radix: 2)!)
}
else{
for i in stride(from: num2.count-1, through: 0, by: -1){
if num2[i] == "0"{
num2[i] = "1"
num2[i+1] = "0"
let num2Str = num2.reduce("", {$0 + $1})
result.append(Int64(Int(num2Str,radix: 2)!))
break
}
}
}
}
}
return result
}