[Lv. 2] 2개 이하로 다른 비트프로그래머스/Level 22023. 7. 26. 13:43
Table of Contents
문제 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/77885
난이도 : Level.2
언어 : Kotlin
문제 설명 :
양의 정수 x에 대한 함수 f(x)를 다음과 같이 정의합니다.
- x보다 크고 x와 비트가 1~2개 다른 수들 중에서 제일 작은 수
예를 들어,
- f(2) = 3 입니다. 다음 표와 같이 2보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수가 3이기 때문입니다.
수 | 비트 | 다른 비트의 개수 |
2 | 000 ... 0010 | |
3 | 000 ... 0011 | 1 |
- f(7) = 11 입니다. 다음 표와 같이 7보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수가 11이기 때문입니다.
수 | 비트 | 다른 비트의 개수 |
7 | 000 ... 0111 | |
8 | 000 ... 1000 | 4 |
9 | 000 ... 1001 | 3 |
10 | 000 ... 1010 | 3 |
11 | 000 ... 1011 | 2 |
- 정수들이 담긴 배열 numbers가 매개변수로 주어집니다. numbers의 모든 수들에 대하여 각 수의 f 값을 배열에 차례대로 담아 return 하도록 solution 함수를 완성해주세요.
제한 사항 :
- 1 ≤ numbers의 길이 ≤ 100,000
- 0 ≤ numbers의 모든 수 ≤ 1015
입출력 예 :
numbers | result |
[2, 7] | [3, 11] |
풀이 :
import kotlin.math.pow
class Solution {
fun solution(numbers: LongArray): LongArray {
var answer: LongArray = longArrayOf()
repeat(numbers.size) {
var num = numbers[it]
var temp = num
var n = 0
while (temp > 0) {
if (temp % 2 == 0.toLong()) break
temp /= 2
n++
}
if (n == 0) num++
else num = (num + 2.0.pow(n.toDouble()) - 2.0.pow((n - 1).toDouble())).toLong()
answer += num
}
return answer
}
}
다른 사람의 풀이 :
class Solution {
fun solution(numbers: LongArray): LongArray {
return numbers.map { num -> (num.inv() and num + 1).let { num or it and (it shr 1).inv() } }.toLongArray()
}
}
class Solution {
fun solution(numbers: LongArray): LongArray {
return numbers.map {
val str = it.toString(2)
if (!str.contains('0')) ("10" + str.drop(1)).toLong(2)
else {
val last = str.lastIndexOf('0')
if (last == str.lastIndex) str.replaceRange(last..last, "1").toLong(2)
else str.replaceRange(last..last + 1, "10").toLong(2)
}
}.toLongArray()
}
}
'프로그래머스 > Level 2' 카테고리의 다른 글
[Lv. 2] 가장 큰 수 (0) | 2023.07.26 |
---|---|
[Lv. 2] 다리를 지나는 트럭 (0) | 2023.07.26 |
[Lv. 2] 소수 찾기 (0) | 2023.07.25 |
[Lv. 2] 롤케이크 자르기 (0) | 2023.07.24 |
[Lv. 2] 숫자 변환하기 (0) | 2023.07.24 |
@스몰스테핑 :: 작은 발걸음
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!