코드
def solution(n = 78):
b = bin(n)[2:]
if (index := b.rfind('01')) != -1 :
b = b[:index] + '10' + b[index+2:][::-1]
else :
b = b[0]+'0'+ b[1:][::-1]
return int(b, 2)
패턴 파악하기
자연수를 이진수로 변경
1 -> 1
2 -> 10
3 -> 11
4 -> 100
5 -> 101
6 -> 110
7 -> 111
8 -> 1000
9 -> 1001
10 -> 1010
11 -> 1011
12 -> 1100
13 -> 1101
14 -> 1110
15 -> 1111
16 -> 10000
17 -> 10001
18 -> 10010
19 -> 10011
20 -> 10100
조건에 맞는 다음 큰 수와의 비교
1 | 10
10 | 100
11 | 101
100 | 1000
101 | 110
110 | 1001
111 | 1011
1000 | 10000
1001 | 1010
1010 | 1100
1011 | 1101
1100 | 10001
1101 | 1110
1110 | 10011
1111 | 10111
10000 | 100000
10001 | 10010
10010 | 10100
10011 | 10101
10100 | 11000
1001110 | 1010011 (78, 83)
패턴은 2가지로 요약됨.
case1 :
1
이 연속적으로 나옴 ex) 1111000, 1111, 10000case2 :
1
사이에0
이 있음 ex) 100001, 1110010, 10010010
case1 의 경우엔 제일앞의 1
뒤에 0
을 붙이고 그 나머지 숫자는 뒤집혀짐.
10000 -> 100000
111 -> 1011
1110 -> 10011
case2의 경우엔 제일 오른쪽 01
을 뒤집고 그 뒤에 숫자들이 뒤집혀짐.
10001 - > 10010
110010 -> 110100
1001110 -> 1010011