본문 바로가기
Algorithm

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

by giop15 2022. 3. 14.
반응형

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