반응형
https://programmers.co.kr/learn/courses/30/lessons/77885
코딩테스트 연습 - 2개 이하로 다른 비트
programmers.co.kr
문제 설명
양의 정수 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] |
문제풀이
1. 결과 반환 값(answer)을 선언합니다.
2. 배열 요소 값(number)이 짝수일 때는 무조건 2진수 마지막 자리가 0이다. 마지막 자리 0을 1로 바꿔주면 딱 한자리만 다른 경우이고, 이 경우 바로 다음 숫자이므로 n+1이 가장 작은 숫자이다.
3. 배열 요소 값(number)이 홀수일 때는 가장 마지막 번째 0을 1로 바꿔주고 그다음 숫자를 0으로 바꿔준 숫자가 제일 작은 숫자이다. 모두 1인 경우에는 맨 앞에 1을 추가하고 그다음 숫자를 0으로 바꿔준다.
import Foundation
func solution(_ numbers:[Int64]) -> [Int64] {
var answer = [Int64]()
for number in numbers {
if number % 2 == 0 {
answer.append(number + 1)
} else {
var binary = "0\(String(number, radix: 2))".map { String($0) }
for i in 0..<binary.count {
if binary[binary.count - (i+1)] == "0" {
binary[binary.count - (i+1)] = "1"
if i != 0 {
binary[binary.count - i] = "0"
}
answer.append(Int64(binary.joined(), radix: 2)!)
break
}
}
}
}
return answer
}
반응형
'Algorithm' 카테고리의 다른 글
[프로그래머스] 베스트앨범 (0) | 2022.03.16 |
---|---|
[프로그래머스] 영어 끝말잇기 (0) | 2022.03.15 |
[프로그래머스] 프렌즈4블록 (0) | 2022.03.02 |
[프로그래머스] 피로도 (0) | 2022.02.28 |
[프로그래머스] 카펫 (0) | 2022.02.03 |