프로그래머스 - kotlin/LEVEL 2
[프로그래머스] 2개 이하로 다른 비트 - Kotlin
배준형
2023. 10. 18. 13:09
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
양의 정수 x에 대한 함수 f(x)를 다음과 같이 정의합니다.
- x보다 크고 x와 비트가 1~2개 다른 수들 중에서 제일 작은 수
예를 들어,
- f(2) = 3 입니다. 다음 표와 같이 2보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수가 3이기 때문입니다.
- f(7) = 11 입니다. 다음 표와 같이 7보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수가 11이기 때문입니다.
정수들이 담긴 배열 numbers가 매개변수로 주어집니다. numbers의 모든 수들에 대하여 각 수의 f 값을 배열에 차례대로 담아 return 하도록 solution 함수를 완성해주세요.
나의 풀이
이 문제는 특별한 알고리즘이 필요하지 않는 문제입니다.
숫자가 짝수일 때에는 2진법으로 변환했을 때 0이 가장 오른쪽에 오게 됩니다. 이때에는 현재 숫자에서 + 1만 해주면 원하는 값을 얻을 수 있습니다.
숫자가 홀수일 때에는 가장 오른쪽부터 0을 찾고 해당 위치와 바로 오른쪽 1의 값을 바꾸면 됩니다. 이를 진행하는 코드는 아래와 같습니다.
class Solution {
fun solution(numbers: LongArray): LongArray {
return numbers.map {
if (it % 2 == 0L) {
it + 1
} else {
val binary = it.toString(2).reversed() + "0"
val index = binary.indexOf('0')
val modifiedBinary = binary.substring(0, index - 1) + "01" + binary.substring(index + 1)
modifiedBinary.reversed().toLong(2)
}
}.toLongArray()
}
}