DevKim

[Python] 프로그래머스 LV.02 - 2개 이하로 다른 비트 본문

알고리즘 PS

[Python] 프로그래머스 LV.02 - 2개 이하로 다른 비트

on_doing 2021. 7. 1. 10:19
728x90

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

 

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

 

programmers.co.kr

[ 알고리즘 ]

단순구현

 

[문제 접근]

문제가 어렵다기보단, 일일이 비교하면 시간초과가 나는 문제이다.

처음엔 1씩 더해서 각각의 이진수를 구하고, 끝자리부터 한자리씩 더해나가며 해결하려고 했으나

그렇게 되면 시간복잡도가 어마어마하게 커지게 된다.

 

이 문제는 짝수와 홀수를 나눠서 생각 할 필요가 있다.

 

(1) 짝수 case

짝수의 경우 2진법으로 바꾸면, 무조건 끝에 0이 오게되어있다.

1~2자리수만 다르면 되므로, 맨 끝에 0을 1로만 바꿔주면된다.

 

(2) 홀수 case

홀수의 경우 7=111 이런 경우를 대비하여, 맨 앞에 0을 먼저 넣어줬다.

그 다음, 끝에서부터 0인 부분을 찾아서 1로 바꿔주고, 끝에 바로 전의 숫자를 0으로 바꿔준다.

예를 들어,

7=0111 의 경우 0111 -> 1111 -> 1011 이렇게 바꿔주면 제일 작으면서 2자리수가 다른 비트가 나오게된다.

 

2진법을 10진법으로 바꿀 땐, int(수,2) 내장함수를 사용하였다.

 

[코드]

from collections import deque

# 2진수 구하기
def func(num):
    que = deque()
    while num > 1:
        ptr = num % 2
        num = num // 2
        que.appendleft(ptr)
    que.appendleft(num)
    return que

def solution(numbers):
    answer = []
    for num in numbers:
        ans = func(num)

        # 짝수일 때
        if num % 2 == 0:
            ans[-1] = 1
        else:
            if ans[0] == 1:
                ans.appendleft(0)
            # 제일 끝의 0 찾기
            for i in range(-1, -len(ans) - 1, -1):
                if ans[i] == 0:
                    ans[i] = 1
                    ans[i + 1] = 0
                    break

        answer.append(int(''.join(map(str,ans)), 2))

    return answer
728x90
Comments