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

PhilAI·2023년 9월 8일
0

📌 문제

https://school.programmers.co.kr/learn/courses/30/lessons/77885

📌 풀이

풀이 1 - (성공)

문제에서 원하는 것은 주어진 숫자x보다 크고 x와 비트가 1~2개 다른 수들 중에서 제일 작은 수 찾는 것이다.
이문제는 짝수와 홀수로 나누어 이 문제를 풀 수 있다.

- 짝수일때
짝수를 이진법으로 변환했을때 마지막 숫자는 무조건 0이 될것이다.
2 --> 10
4 --> 100
6 --> 110
마지막 숫자를 0을 1로 바꿔주면 x보다 크지만 다른 비트 갯수가 1개인 숫자를 찾을 수 있다.
이 숫자는 주어진 짝수에서 +1가 된다.

- 홀수일때
홀수를 이진법으로 변환했을때 가장 오른쪽에 있는 '0'을 찾는 것이 중요하다.
가장 오른쪽에 위치한 0의 인덱스가 n이라고 가정한다.
그렇다면 n인덱스에 위치한 0을 1로 바꿔주고, n+1에 위치한 0으로 바꿔준다.
예를 들자면 아래와 같습니다.
3 --> 011 --> 101(5)
5 --> 101 --> 110(6)
7 --> 0111 --> 1011(11)
9 --> 1001 --> 1010(10)

  1. for문을 돌려 numbers 리스트에 있는 원소를 하나씩 꺼낸다. 꺼낸 원소를 n이라고 부르겠다.
  2. 만약 n이 짝수라면 n+1을 한 값을 answer에 집어넣는다.
  3. 만약 n이 홀수라면 가장 오른쪽에 있는 0을 찾고 그 인덱스값을 right_idx에 저장한다. right_idx값을 1로 바꾸고 right_idx+1 값을 0으로 바꾼다.
    3-1. 3단계를 거친 string 리스트를 하나로 합치고 이를 숫자형(int)로 바꾼다.
    3-2. 이진 숫자를 다시 십진법 숫자로 변환하여 answer에 집어 넣는다.
def solution(numbers):
    answer = []

    for n in numbers:
        if n % 2 == 0:  # 짝수일 경우
            answer.append(n + 1)
        else:  # 홀수 인 경우
            temp = '0' + bin(n)[2:]
            right_idx = temp.rfind('0')
            temp_list = list(temp)
            
            temp_list[right_idx] = '1'
            temp_list[right_idx+1] = '0'
            
            temp_str = "".join(temp_list)
            
            answer.append(int(temp_str, 2))
                
    return answer
profile
철학과가 도전하는 Big Data, AI

0개의 댓글