코딩테스트/프로그래머스

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

박소민 2025. 5. 13. 15:51
2개 이하로 다른 비트
 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

  • 내 풀이
    • 이진수에 0이 하나도 없는 경우, 가장 끝이 0 인경우, 가장 끝이 1인경우로 나눠서 계산
      • 가장 끝이 0 인경우: 1 더하면 1개만 바뀐 수
      • 가장 끝이 1인 경우: 가장 뒷쪽에 있는 0 위치의 값과, 그 뒤에 있는 값 2개만 변해야함
    • 이진수 길이 = 가장 뒷편인 0의 인덱스 값과 동일하기 때문에
      • → 사실상 짝수인경우(가장 끝이 0인경우), 홀수 인경우(가장 끝이 1인경우) 로 보는거랑 똑같음
      • (이진수에 0이 하나도 없는 경우가 끝이 1인 경우에 포함)
    • idx찾을 때 리버스한 다음에 index 사용했는데 문자열에 rfind 하는 방법도 있음
def solution(numbers):
    answer=[]
    for num in numbers:
        bin_num=[0]+list(map(int,bin(num)[2:]))
        idx=list(reversed(bin_num)).index(0)
        l=len(bin_num)-1
        
        if idx>=l: #0이 없는 경우
            answer.append(num+2**(l-1))
        elif idx==0: #0이 제일 끝에 있는 경우
            answer.append(num+1)
        else: #0이 가운데 끼인 경우
            answer.append(num+2**(idx-1))
            
    return answer

 

 

  • 다른 사람 코드
    • 짝수/홀수로 나눠서 봄
    • int(s, 2)를 해주면 2진수 s를 10진수로 변환
def solution(numbers):
    answer = []

    for number in numbers:
        bin_number = list('0' + bin(number)[2:])
        idx = ''.join(bin_number).rfind('0')
        bin_number[idx] = '1'
        
        if number % 2 == 1:
            bin_number[idx+1] = '0'
        
        answer.append(int(''.join(bin_number), 2))

    return answer