K-th Symbol in Grammar
Problem
On the first row, we write a 0. Now in every subsequent row, we look at the previous row and replace each occurrence of 0 with 01, and each occurrence of 1 with 10.
Given row N and index K, return the K-th indexed symbol in row N. (The values of K are 1-indexed.) (1 indexed).
Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Input: N = 1, K = 1
Output: 0
Input: N = 2, K = 1
Output: 0
Input: N = 2, K = 2
Output: 1
Input: N = 4, K = 5
Output: 1
Explanation:
row 1: 0
row 2: 01
row 3: 0110
row 4: 01101001
My Answer
- 이진 트리로 생각 할 수 있다.
- 부모노드가 0일때 왼쪽 자식 노드는 0, 오른쪽 자식 노드는 1
- 부모노드가 1일때 왼쪽 자식 노드는 1, 오른쪽 자식 노드는 0

- 만약 K가 짝수이면
k/2번째 노드의 오른쪽 노드이다. - 만약 K가 홀수이면
(k+1)/2번째 노드의 왼쪽 노드이다. - 하지만, 부모노드의 값을 알아야 하기 때문에, 재귀로 부모 노드의 값이 뭔지 알아 낸다.
1
2
3
4
5
6
7
8
9
10
11
class Solution {
public int kthGrammar(int N, int K) {
if ( N == 1 ) { //N이 1이라는것은 루트노드 (0)을 의미 K는 의미 없다.
return 0;
} else if ( K % 2 == 0 ) { // K가 짝수라면, 이전 Row의 K/2의 값이 뭔지 알아내야 한다. 그것이 부모노드니까. 그리고, 부모노드가 0이라면 나는 1이고 1이라면 나는 0이다.
return kthGrammar ( N -1, K / 2) == 0 ? 1 : 0;
} else { // K가 홀수라면, 이전 Row의 (K+1)/2의 값이 뭔지 알아내야 한다. 그것이 부모노드니까. 그리고, 부모노드가 0이라면 나는 0이고 1이라면 나는 1이다.
return kthGrammar( N -1, (K + 1) /2) == 0 ? 0 : 1;
}
}
}