779. K-th Symbol in Grammar

  • κ·œμΉ™μ„±μ„ 기반으둜 μƒμ„±λ˜λŠ” λ°μ΄ν„°μ˜ νŠΉμ • μœ„μΉ˜ 값을 μ•Œμ•„λ‚΄λŠ” 문제.
  • 첫번째 rowλŠ” 0 값을 κ°€μ§€λ©° λ‘λ²ˆμ¨° λΆ€ν„°λŠ” 0 β†’ 01, 1 β†’ 10으둜 λŒ€μ²΄ν•˜λŠ” λ°©μ‹μœΌλ‘œ λ‹€μŒ rowλ₯Ό μƒμ„±ν•œλ‹€.
  • 처음 5개의 rowλ₯Ό λ‚˜μ—΄ν•΄λ³΄λ©΄ μ•„λž˜μ™€ κ°™λ‹€.
    • ["0", "01", "0110", "01101001", "0110100110010110"]
  • μ—¬κΈ°μ„œ μ•Œ 수 μžˆλŠ” κ·œμΉ™μ€ λ‹€μŒκ³Ό κ°™λ‹€.
    • row의 번호 n μ™€λŠ” 관계없이 k번째 symbol이 μ •ν•΄μ§„λ‹€.
    • n은 λ‹¨μˆœμ΄ k κ°’μ˜ λ²”μœ„λ₯Ό μ œν•œν•  뿐이닀.
    • "0110" μ΄λΌλŠ” νŒ¨ν„΄μ΄ μž¬κ·€μ μœΌλ‘œ λ°˜λ³΅λœλ‹€.
    • (1) k = ~ 4^1 pattern: "0110" sub pattern: "0" β†’ "0", "1" β†’ "1" (2) k = ~ 4^2 pattern: "0110 1001 1001 0110" sub pattern: "0" β†’ "0110", "1" β†’ "1001" (3) k = ~ 4^3 pattern: "0110100110010110 1001011001101001 1001011001101001 0110100110010110" sub pattern: "0" β†’ "0110100110010110", "1" β†’ "1001011001101001"
    • μœ„μ˜ κ·œμΉ™μ„ μ‚΄νŽ΄λ³΄λ©΄ νŒ¨ν„΄μ˜ 0에 ν•΄λ‹Ήλ˜λŠ” 경우 μ„œλΈŒ νŒ¨ν„΄μ˜ 값이 μœ μ§€λ˜λ©° 1에 ν•΄λ‹Ήλ˜λŠ” 경우 μ„œλΈŒ νŒ¨ν„΄μ˜ 값을 λ°˜μ „ν•˜λŠ” ν˜•νƒœλ‘œ ꡬ성됨을 μ•Œ 수 μžˆλ‹€.
  • κ·œμΉ™μ„ λ°”νƒ•μœΌλ‘œ 생각해보면 λ‹€μŒκ³Ό 같은 λ‘œμ§μ„ 얻을 수 μžˆλ‹€.
    • νŒ¨ν„΄ PATTERN을 μ •μ˜ν•œλ‹€.
    • k값을 0-base둜 λ³€κ²½ν•œλ‹€ --k
    • LSB 2 bitλ₯Ό κΈ°μ€€μœΌλ‘œ 졜초 νŒ¨ν„΄μ—μ„œμ˜ κ°’ PATTERN[k % 4]을 μ°Ύκ³  bitλ₯Ό shift k >>= 2 ν•œλ‹€.
    • k값이 0이 되기 μ „κΉŒμ§€ λ‹€μŒμ„ λ°˜λ³΅ν•œλ‹€.
      • LSB 2 bitλ₯Ό κΈ°μ€€μœΌλ‘œ 졜초 νŒ¨ν„΄μ—μ„œμ˜ κ°’ PATTERN[k % 4]을 μ°ΎλŠ”λ‹€.
      • ν•΄λ‹Ή 값이 0이면 ν˜„μž¬ 값을 μœ μ§€ν•˜κ³  1이면 값을 λ°˜μ „ 0 β†’ 1, 1 β†’ 0 ν•œλ‹€.
      class Solution { public: const vector<int> PATTERN = {0, 1, 1, 0}; int kthGrammar(int n, int k) { --k; int result = PATTERN[k % 4]; k >>= 2; while (k > 0) { if (PATTERN[k % 4] == 1) result = result == 0? 1 : 0; k >>= 2; } return result; } };