본문 바로가기
Algorithm/프로그래머스

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

by 2HS 2022. 4. 6.
 

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

 

programmers.co.kr

 

def solution(numbers):
    answer = []
    for x in numbers:
        x = int(x) # 7,8,9번 런타임 에러 문제의 입력 오류
        arr = list('0'+bin(x)[2:])
        index = ''.join(arr).rfind('0')
        arr[index] = '1'
        if x % 2 != 0:
            arr[index+1] = '0'
        answer.append(int(''.join(arr), 2))
    return answer

 

풀이
1. 각 숫자마다
    - 2진수로 바꾸고 맨 앞에 '0'을 추가 (슬라이싱 : bin을 이용해서 2진수로 바꾸면 앞에 '0b'라는 표시가 있어서 제거)
    - index : 뒤에서부터 처음 '0'이 등장하는 인덱스 (rfind : 오른쪽부터 find)
    - index의 값을 '1'로 바꿔주기
    - 홀수일 경우, index+1의 값을 '0'으로 바꿔주기
    - anwer에 10진수로 바꿔서 append (int('2진수 문자열', 2) : 2진수의 10진수화)
2. answer 리턴

 

2 이하의 비트 차이가 나는 수중 가장 작은 수를 구할 경우

짝수일 경우 : 맨 마지막 0을 1로 교체 (1비트 차이의 가장 작은 수)

홀수일 경우 : 맨 마지막 0을 1로 교체하고 다음 위치를 0으로 교체 (2비트 이하 차이의 가장 작은 수)

 

문제의 오류가 있었다.

7, 8, 9번에 런타임 오류가 발생했는데 분명 문제에서는 정수라고 했다.

numbers의 각 숫자를 int화 해주고 실행하면 해결