2021. 6. 3. 17:10ㆍ알고리즘
※사용언어 : 파이썬 ※
▼ 문제 링크 ▼
https://programmers.co.kr/learn/courses/30/lessons/77885
문제 접근
◇ 짝수와 홀수의 경우로 나누어서 생각해볼 수 있다.
◇ 짝수인 경우 마지막 bit를 0에서 1로 바꾸면 X보다 크면서 1~2개 비트가 다른 수 중 가장 최솟값이 된다.
◇ 홀수인 경우 크게 2가지 경우로 나뉜다.
➡ 1. 2진수로 전환시 모든 비트가 1인 경우 (EX. 7, 15)
➡ 2. 모든 비트가 1이 아닌 경우 (0이 섞여있는 경우로 9 같은 숫자를 예로 들 수 있다.)
◇ 모든 비트가 1인 경우에는 앞에 있는 01을 10으로 바꿔줍니다.
◇ 모든 비트가 1이 아닌 경우에는 가장 마지막에 등장하는 01을 10으로 바꿔줍니다.
문제 풀이 (with Python)
def solution(numbers):
answer = []
for i in numbers:
if i%2==0:
answer.append(i+1)
else:
bin_num=str(format(i,'b'))
point=bin_num.rfind('01')
if point==-1:
bin_num='10'+bin_num[1:]
print(bin_num)
answer.append(int(bin_num,2))
else:
bin_num=bin_num[:point]+'10'+bin_num[point+2:]
answer.append(int(bin_num,2))
return answer
◇ 짝수인 경우 입력 받은 number에 +1을 해줍니다
◇ 홀수 인 경우 format(i,'b') 를 통해 number를 2진수로 변환 → 2진수를 문자열로 바꾸고 rfind를 통해 문자열 뒤에서부터 01이 있는지 탐색 (없는 경우 -1을 리턴, 있는 경우 01이 시작되는 위치(즉 0의 위치)의 인덱스 값 반환)
◇ -1이 반환되는 되면 모든 비트가 1이라는 뜻으로 문자열의 제일 앞에 부분을 자르고 그 앞에 '10'을 붙인다.
◇ -1이 아닌 경우 인덱스 위치 전까지 자르고 '10'을 더한 다음 뒤에 있는 문자열을 이어붙임. 이때 point+2가 문자열 범위 밖이면 빈 값을 리턴함
EX. 101011 같은 경우 101 까지 자르고 여기어 10을 더한 뒤 뒤에 있는 1을 붙임
'알고리즘' 카테고리의 다른 글
[프로그래머스] 섬 연결하기 파이썬 풀이 (0) | 2021.08.07 |
---|---|
[백준] 19638 센티와 마법의 뽕망치 파이썬 풀이 (0) | 2021.06.22 |
[백준] 1655 가운데를 말해요 파이썬 풀이 (7) | 2021.05.27 |
[백준] 9093 단어 뒤집기 파이썬 풀이 (0) | 2021.03.25 |
[백준] 15828 Router 자바 풀이 (0) | 2021.03.18 |