λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸƒ algorithm/leetcode

LeetCode 22 - Generate Parentheses (Medium)

by HandHand 2021. 3. 2.

문제

LeetCode - 22번

풀이 κ³Όμ •

주어진 κ΄„ν˜ΈμŒμ˜ κ°œμˆ˜μ— λ§žλŠ” μ˜¬λ°”λ₯Έ κ΄„ν˜Έ 배치λ₯Ό μƒμ„±ν•˜λŠ” λ°±νŠΈλž˜ν‚Ή λ¬Έμ œμž…λ‹ˆλ‹€.

μ΄λ•Œ ν•΄λ‹Ή κ΄„ν˜Έλ°°μΉ˜κ°€ μ˜¬λ°”λ₯΄κ²Œ μœ„ν•΄μ„œλŠ” μ–‘ 끝의 κ΄„ν˜Έκ°€ 각각 ( 와 ) μ—¬μ•Ό ν•œλ‹€λŠ” 점을 μœ μ˜ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.
λ˜ν•œ κ΄„ν˜ΈμŒμ΄ μ˜¬λ°”λ₯΄κΈ° μœ„ν•΄μ„œλŠ” ( κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ¦λ° ) κ°€ ( 보닀 λ¨Όμ € ν• λ‹Ήλ˜λ©΄ μ•ˆλ©λ‹ˆλ‹€.
λ”°λΌμ„œ 각각의 μž¬κ·€ ν˜ΈμΆœλ§ˆλ‹€ ( 의 μ—¬μœ λΆ„μ΄ μžˆλ‹€λ©΄ ) λ₯Ό μ‹œλ„ν•΄λ³΄λŠ” λ°©μ‹μœΌλ‘œ μ§„ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
λ‹€λ§Œ ( λ˜ν•œ μ΅œλŒ€ n 번 만큼만 λ“±μž₯ν•  수 μžˆμœΌλ―€λ‘œ left 와 leftCount λ₯Ό 각각 κ΅¬λΆ„ν•˜μ—¬
μ „μžλŠ” ( 의 μ—¬μœ λΆ„μœΌλ‘œ ) κ°€ λ“±μž₯ν• λ•Œλ§ˆλ‹€ κ°μ†Œμ‹œμΌœμ€¬κ³ , ν›„μžλŠ” ν˜„μž¬κΉŒμ§€ μ„ νƒλœ ( 의 개수λ₯Ό λ‚˜νƒ€λ‚΄λ„λ‘ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

μ½”λ“œ

/**
 * @param {number} n
 * @return {string[]}
 */
var generateParenthesis = function (n) {
  const answer = [];

  function dfs(parentheses, left, leftSelected, depth) {
    if (depth === 2 * n - 1) {
      answer.push(parentheses + ")");
      return;
    }

    // λ§Œμ•½ μ™Όμͺ½ κ΄„ν˜Έκ°€ μ‘΄μž¬ν•œλ‹€λ©΄
    if (left) {
      dfs(parentheses + ")", left - 1, leftSelected, depth + 1);
    }

    // μ™Όμͺ½ κ΄„ν˜Έ μ—¬μœ λΆ„μ΄ μžˆλ‹€λ©΄
    if (leftSelected < n) {
      dfs(parentheses + "(", left + 1, leftSelected + 1, depth + 1);
    }
  }

  dfs("(", 1, 1, 1);
  return answer;
};
λ°˜μ‘ν˜•

πŸ’¬ λŒ“κΈ€