Algorithm / 2개 이하로 다른 비트

알고리즘 코드카타

목록 보기
53/59

문제

프로그래머스 / 2개 이하로 다른 비트

1) 문제 풀이

func solution(_ numbers:[Int64]) -> [Int64] {
    var answer: [Int64] = []
    
    for num in numbers {
        var count = 3
        var result = num
        
        while count > 2 {
            result += 1
            let distance = (num ^ result).nonzeroBitCount
            
            if distance <= 2 {
                answer.append(result)
            }
            
            count = distance
        }
        
    }
    
    return answer
}

결과

2) 코드 개선

⚠️ 문제점 분석

  • 불필요한 while 루프
    • count > 2일 때 루프를 돌고 있지만, 조건이 만족해도 루프는 계속 돌아가는 상황
    • if distance <= 2이면 answer.append(result)만 하고 루프 종료를 하지 않음 -> count 값만 바꾸고 루프 계속
  • 시간 복잡도
    • while 루프에서 result += 1씩 증가시키므로 최악의 경우 선형 탐색 -> 느림
    • 특히, 큰 수일 경우 매우 비효율적

✅ 개선 포인트

  • 핵심 규칙
    • 짝수인 수 = 바로 다음 수는 비트 차이가 1
    • 홀수인 수: 가장 오른쪽 0을 1로 바꾸고, 그 다음 비트를 0으로 바꾸면 비트 차이 2
    • num + 1 + (num ^ (num + 1)) >> 2로 계산할 수 있음
func solution(_ numbers: [Int64]) -> [Int64] {
    return numbers.map { num in
        if num % 2 == 0 {
            return num + 1
        } else {
            var bit: Int64 = 1
            while (num & bit) != 0 {
                bit <<= 1
            }
            return num + bit - (bit >> 1)
        }
    }
}

결과

profile
이유있는 코드를 쓰자!!

0개의 댓글