본문 바로가기

PS/프로그래머스

[프로그래머스 LV2] 2개 이하로 다른 비트(파이썬/python)

728x90

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

 

코딩테스트 연습 - 2개 이하로 다른 비트

 

programmers.co.kr

 

이 문제는

 

1. 2진법으로 변환한 후

 

2. 2진법숫자를 오른쪽부터 왼쪽으로 탐색하며

0이 나오면 1로만들어줌.

1로만들어준 숫자 오른쪽에 1이 있으면 이걸 0으로 만들어줌

 

3. 변환한 숫자를 다시 10진법 숫자로 만들어줌

 

이 과정을 거치면된다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 이진법 변환 함수
from collections import deque
 
 
def bi_trans(x):
    li = ["0""1"]
    result = deque()
 
    while x > 0:
        result.appendleft(li[x % 2])
        x = x // 2
 
    result.appendleft("0")
 
    return result
 
 
def check_num(li_x):
    # 뒤에서부터 검사하며 0이 있으면 1로 바꾸고, 바뀐숫자 오른쪽에 1이 있을시 0으로 바꿔줌
    for x in range(len(li_x) - 1-1-1):
        if li_x[x] == "0":
            li_x[x] = "1"
            if len(li_x) > (x + 1):
                li_x[x + 1= "0"
            break
 
    return li_x
 
 
def bi_to_num(num_li):
    number = 0
    mul_num = 1
    for i in range(len(num_li) - 1-1-1):
        if num_li[i] == "1":
            number += mul_num
        mul_num *= 2
 
    return number
 
 
def solution(numbers):
    answer = []
 
    for n in numbers:
        target_num = bi_trans(n)
        check_target = check_num(target_num)
        answer.append(bi_to_num(check_target))
 
    return answer
 
 
 
 
cs
728x90