숫자 n이 주어졌을 때, 이 숫자가 첫 번째 비트(최상위 비트)와 마지막 비트(최하위 비트)에만 1이 설정되어 있는지 확인해야 합니다.
예를 들어, 입력값이 n = 17이라면 출력은 True입니다. 17의 이진수 표현은 10001로, 첫 번째 위치와 마지막 위치에만 1이 두 개 존재하기 때문입니다.
해결 접근 방법
이 문제는 다음 단계를 통해 해결할 수 있습니다:
- n이 1과 같다면 True를 반환합니다.
- 그렇지 않으면, n - 1이 2의 거듭제곱인지 확인합니다. 2의 거듭제곱이라면 True, 아니라면 False를 반환합니다.
핵심 아이디어는 다음과 같습니다. 첫 번째와 마지막 비트만 설정된 수는 2k + 1 형태입니다. 따라서 n - 1은 2k가 되며, 이 값이 2의 거듭제곱인지만 검사하면 됩니다. 2의 거듭제곱 여부는 비트 연산 (n & (n-1)) == 0을 통해 간단히 판별할 수 있습니다.
예제 코드
def is_pow_of_two(n):
return (n & n-1) == 0
def solve(n):
if n == 1:
return True
return is_pow_of_two(n-1)
n = 17
print(solve(n))입력
17
출력
True