https://school.programmers.co.kr/learn/courses/30/lessons/77885
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
from collections import deque
def solution(numbers):
result = []
for number in numbers:
result.append(f(number))
return result
def f(x):
if x % 2 == 0:
return x+1
else:
cur = deque(bin(x)[2:])
nex = deque(bin(x+1)[2:])
if len(nex)>len(cur):
cur.appendleft(0)
for i in range(len(cur)-1,-1, -1):
if cur[i] == '0':
break
cur[i], cur[i+1] = 1, 0
return int(''.join(map(str, cur)), 2)
문자열의 인덱스 앞쪽(0
)에 값을 넣을 때 시간복잡도를 줄이기 위하여
collections
의 deque
라이브러리를 사용했습니다.
문제를 해결하기 위하여 일정한 규칙을 찾을 수 있었습니다.
먼저 입력으로 들어오는 number
가 짝수
라면 number+1
이 number
보다 크고 비트가 1~2개 다른 수 중 가장 작은 수로 return
이 됩니다.
2
:0010
3
:0011
4
:0100
5
:0101
6
:0110
7
:0111
위 처럼 짝수
일 경우에는 가장 마지막인덱스(맨 오른쪽)의 값이 0
이 되기 때문에
여기가 1
로 바뀌기만 한다면 조건에 부합한 수가 됩니다.
홀수
일 경우에는 오른쪽부터 즉 len(cur)
부터 인덱스 0번까지 값을 확인할 때 가장 먼저 등장한 0
을 1
로0
의 오른쪽의 있는 1
을 0
으로 바꾸어준 수가 return
이 됩니다.
7
를 예를 들어보겠습니다.
7
:0111
len([0,1,1,1])
부터 인덱스 0번까지 값을 읽을때 인덱스 0번에서 숫자 0
이 가장 먼저 등장합니다.
0번 인덱스에 위치한 숫자 0
을 1로 바꾸어줍니다.
그리고 0번 인덱스의 오른쪽에 있는 1번 인덱스의 1
을 0으로 바꾸어주면 1011
의 값이 나오게 됩니다.
1011
을 10진수로 바꾸어준다면 11이 되고 이 값을 return
하게 됩니다.
코드에서는 bin()
함수를 사용하게 되면 0111
는 111
로 표현되기 때문에
다음 수보다 길이가 짧을 경우에는 앞에 0을 넣어주었습니다.
나머지는 위의 설명과 동일합니다.
'코딩테스트' 카테고리의 다른 글
[코딩테스트] 프로그래머스 문자열 나누기 파이썬(Python) (0) | 2023.03.24 |
---|---|
[코딩테스트] 프로그래머스 [3차] 방금그곡 파이썬(Python) (0) | 2023.03.23 |
[코딩테스트] 프로그래머스 숫자 변환하기 파이썬(Python) (0) | 2023.03.21 |
[코딩테스트] 프로그래머스 예상 대진표 파이썬(Python) (1) | 2023.03.20 |
[코딩테스트] 백준 차이를 최대로 파이썬(Python) (0) | 2023.03.18 |