[LeetCode] 1545. Find Kth Bit in Nth Binary String

Ho__sing·2024년 1월 10일
0
post-custom-banner

Intuition

n의 최댓값이 20이기 때문에, S20S_{20}까지의 모든 문자열을 만들어 확인해보는 것이 가능하지만,
문제의 description에서 base case와 점화식이 주어지므로 재귀를 고려해볼 수 있다.

Approach

SnS_n문자열은 1이 위치한 2n1(n2)2^{n-1} (n\geq2)번째 bit를 기준으로, 그 앞은 Sn1S_{n-1}과 동일하다.
그 뒷부분에 대해 살펴보겠다.
2n12^{n-1}번째 bit를 기준으로, kk번째 bit까지의 거리는 k2n1k-2^{n-1}로 동일하다.
따라서, SnS_nkk번재 비트는 Sn1S_{n-1}2n1(k2n1)=2nk2^{n-1}-(k-2^{n-1})=2^n-k이다.그리고 해당 비트를 invert하면 된다.

f(n,k):=f(n,k):=SnS_n에서 kk번째 비트의 값
f(n,k)={f(n1,k)k<2n11k==2n1invert(f(n1,2nk))k>2n1f(n,k)=\begin{cases}f(n-1,k) & k<2^{n-1}\\1 & k==2^{n-1}\\invert(f(n-1,2^n-k))&k>2^{n-1}\end{cases}

Base Case는 f(1,1)=0f(1,1)=0이다.

Solution

#define invert(a) ((a)=='0'?'1':'0')

char findKthBit(int n, int k) {
    if (n==1||k==1) return '0';

    int one=1<<(n-1);

    if(k<one) return findKthBit(n-1,k);
    if(k==one) return '1';
    else return invert(findKthBit(n-1,(one<<1)-k));       
}

Complexity

Time Compelxity & Space Complexity

O(N)O(N)

지적 및 질문 환영

profile
ps 독학하면서 스스로에게 강의하며 정리 하는 곳, 지적과질문 환영
post-custom-banner

0개의 댓글