문제 개요
숫자 n과 값 k가 주어졌을 때, n의 k번째 비트가 설정(1)되어 있는지 여부를 확인해야 합니다. 이때 k는 오른쪽 끝 비트부터 세는 기준으로 사용합니다.
예를 들어 입력이 n = 23, k = 3이라면 출력은 True가 됩니다. 23의 이진수 표현은 10111이며, 오른쪽에서 세 번째 비트가 1로 설정되어 있기 때문입니다.
해결 접근 방법
이 문제는 다음 단계를 통해 해결할 수 있습니다.
- n을 오른쪽으로 (k - 1)비트만큼 시프트한 값을 temp에 저장합니다.
- temp와 1을 AND 연산한 결과가 1이면 True를 반환합니다.
- 그렇지 않으면 False를 반환합니다.
핵심 아이디어는 간단합니다. 확인하려는 비트를 시프트 연산으로 가장 오른쪽 자리로 이동시킨 뒤, 1과의 AND 연산으로 해당 비트가 실제로 1인지 검사하는 것입니다.
예제 코드
def solve(n, k):
temp = n >> (k - 1)
if temp & 1:
return True
return False
n = 23
k = 3
print(solve(n, k))입력
n = 23, k = 3
출력
True
동작 원리 상세 설명
코드에서 n >> (k - 1)은 n의 모든 비트를 오른쪽으로 (k-1)칸 이동시켜, 확인하고자 하는 k번째 비트를 맨 오른쪽 자리로 가져옵니다. 이후 temp & 1 연산을 수행하면 마지막 비트만 남게 되므로, 결과가 1이면 해당 비트가 설정된 것이고 0이면 설정되지 않은 것입니다.
참고로 위 로직은 다음과 같이 한 줄로도 표현할 수 있습니다.
def solve(n, k):
return bool((n >> (k - 1)) & 1)두 방식 모두 시간 복잡도는 O(1)로 매우 효율적이며, 비트 조작(bit manipulation) 문제에서 자주 사용되는 기본 패턴입니다.