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
}