Notice
Recent Posts
Recent Comments
«   2024/12   »
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
Tags
more
Archives
Today
Total
관리 메뉴

No Limitation

[구현, 시뮬레이션] 2개 이하로 다른 비트 - 프로그래머스 본문

프로그래밍

[구현, 시뮬레이션] 2개 이하로 다른 비트 - 프로그래머스

yesungcho 2022. 2. 12. 13:03

https://programmers.co.kr/learn/courses/30/lessons/77885?language=python3 

 

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

 

programmers.co.kr

 

진수 개념에 대한 참고

https://brownbears.tistory.com/467

 

개인적으로 굉장히 어려운 문제라고 생각이 들고 연습이 많이 필요한 유형이다

 

여러 가지 다양한 규칙을 찾아보는 문제로 추측이 되는데, 최근 이러한 '비트'문제를 많이 요구하는 문제들이 많은 것 같다. 

해당 문제의 경우 홀수 짝수를 나누어서 생각을 했던 것이 포인트였다. 다음과 같은 규칙이 있다.

 

1. 짝수

짝수의 경우

f(2) ⇒ 10 —→ '3' ⇒ 11

f(4) ⇒ 100 —→ '5' ⇒ 101

f(6) ⇒ 110 ...

f(8) ⇒ 1000 ...

f(10) ⇒ 1010 —→ '11' ⇒ 1011

즉 구해진 수에 +1만 더하면 된다.

 

반면 홀수의 경우

2. 홀수

f(1) ⇒ 1 —> '2' => 10

f(3) ⇒ 11 —→ '5' ⇒ 101

 

즉 가장 큰 단위의 1 부분의 앞부분인 0을 1로 바꾸어 큰 수를 만들고 그 다음 1을 0으로 바꾸어주는 규칙을 적용하면 된다.

 

바로 이러한 규칙을 찾는 것이 어려운 문제였다.

 

문자열도 대체가 안되기 때문에 그러한 부분을 고려한 문제로 조금 어려운 문제였던 것 같다.

 

def solution(numbers):
    answer = []; strs='';
    for num in numbers : 
        if num%2 == 0 : 
            answer.append(num+1)
        else : 
            strs = bin(num)[2:]
            for s in range(len(strs)-1,-1,-1) : 
                if strs[s] == '0' : 
                    strs = strs[:s]+'10'+strs[s+2:]
                    answer.append(int(strs,2))
                    break
                if s == 0 :
                    strs = '10' + strs[1:]
                    answer.append(int(strs,2))
                    break
    return answer