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

DoDoBest

·

2024. 4. 25. 10:43

https://school.programmers.co.kr/learn/courses/30/lessons/77885

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

로직

짝수인 경우에는 1을 더해줬고
홀수인 경우에는 오른쪽에서 최초로 만나는 0 비트와 바로 뒤에 있는 1비트를 반전시켜줬습니다.

 

숫자의 비트를 확인하기 위해 string으로 변환하지 않고, 숫자 2에 2를 곱하면서 각 비트를 확인해줬습니다.

비트를 반전시키기 위해 xor 연산을 이용했습니다.

 

2를 곱하는 대신 shl, 2를 나누는 대신 shr 함수를 이용해도 됩니다.

class Solution {
    fun solution(numbers: LongArray): LongArray {
        val answer: LongArray = LongArray(numbers.size)

        for ((idx, number) in numbers.withIndex()) {
            answer[idx] = if (number % 2 == 0L) {
                number + 1
            } else {
                operateBit(number)
            }
        }
        return answer
    }

    fun operateBit(num: Long): Long {
        var bit = 2L
        var count = 1

        while (true) {
            if (bit.and(num) != bit) {
                break
            }
            count++
            bit *= 2 // bit = bit.shl(1)
        }
        return num.xor(bit).xor(bit/2) // return num.xor(bit).xor(bit.shr(1))
    }
}