Developing Myself Everyday
article thumbnail
 

프로그래머스

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

programmers.co.kr

사진: UnsplashMarkus Spiske

 

 

문제 설명

양의 정수 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()
    }
}
profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!