Intuition
n의 최댓값이 20이기 때문에, S20까지의 모든 문자열을 만들어 확인해보는 것이 가능하지만,
문제의 description에서 base case와 점화식이 주어지므로 재귀를 고려해볼 수 있다.
Approach
Sn문자열은 1이 위치한 2n−1(n≥2)번째 bit를 기준으로, 그 앞은 Sn−1과 동일하다.
그 뒷부분에 대해 살펴보겠다.
2n−1번째 bit를 기준으로, k번째 bit까지의 거리는 k−2n−1로 동일하다.
따라서, Sn의 k번재 비트는 Sn−1의 2n−1−(k−2n−1)=2n−k이다.그리고 해당 비트를 invert하면 된다.
f(n,k):=Sn에서 k번째 비트의 값
f(n,k)=⎩⎪⎪⎨⎪⎪⎧f(n−1,k)1invert(f(n−1,2n−k))k<2n−1k==2n−1k>2n−1
Base Case는 f(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)
지적 및 질문 환영