Skip to content

[Leetcode] 38. Count and Say โ€‹

Problem โ€‹

๋ฌธ์ œ ๋งํฌ

  1. N == 1์ด๋ฉด 1์ด๋‹ค.
  2. N != 1์ด๋ฉด N-1์˜ Say๊ฐ’์„ ๋ฐ›๋Š”๋‹ค.
  3. Say๋ž€, ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ๊ฐ’(์ˆซ์ž)์„ ์•ž์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ฝ์—ˆ์„๋•Œ ์—ฐ์†๋˜๋Š” ์ˆซ์ž์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜๋‚ฉํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.
    • ex) 3322251 : 3์ด 2๊ฐœ, 2๊ฐ€ 3๊ฐœ, 5๊ฐ€ 1๊ฐœ, 1์ด 1๊ฐœ ๋”ฐ๋ผ์„œ, 23321511์„ ๋ฆฌํ„ดํ•˜๋ฉด๋œ๋‹ค.
  4. N์˜ Say์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ

Solution โ€‹

N == 1์ธ ์กฐ๊ฑด์„ ์ด์šฉํ•ด์„œ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.
N-1์˜ ๊ฐ’์„ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๋Œ๋ ค์„œ ๊ฐ€์žฅ ๊นŠ์€ depth์—์„œ N == 1์ผ๋•Œ 1์„ ๋ฐ˜๋‚ฉํ•˜๊ณ  N == 2์ผ๋•Œ๋ถ€ํ„ฐ Say๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๊ณ  ๊ทธ ๊ฐ’์„ N == 3 depth์— ๋ฐ˜๋‚ฉํ•œ๋‹ค.

์œ„ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ•˜๊ณ ์žํ•˜๋Š” N์˜ Say๊ฐ’์„ ๊ตฌํ•œ๋‹ค.

JS Code โ€‹

javascript
/**
 * @param {number} n
 * @return {string}
 */
var countAndSay = function (n) {
  function dfs(n) {
    if (n === 1) return 1
    return say(dfs(n - 1))
  }

  function say(num) {
    return Array.from(`${num}`)
      .reduce((acc, cur) => {
        if (acc.length === 0) {
          acc.push(1, cur)
        } else {
          if (cur === acc[acc.length - 1]) acc[acc.length - 2]++
          else acc.push(1, cur)
        }
        return acc
      }, [])
      .join('')
  }

  return `${dfs(n)}`
}