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

LeetCode 678 - Valid Parenthesis String (Medium)

by HandHand 2021. 3. 2.

문제

LeetCode - 678번

풀이 κ³Όμ •

주어진 λ¬Έμžμ—΄μ—μ„œ κ΄„ν˜ΈμŒμ΄ μ˜¬λ°”λ₯΄κ²Œ μ§μ§€μ–΄μ‘ŒλŠ”μ§€ νŒλ‹¨ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

λ‹€λ§Œ 이 λ¬Έμ œμ—μ„œλŠ” μ™€μΌλ“œμΉ΄λ“œ(*) κ°€ μ‘΄μž¬ν•˜μ—¬ μ•½κ°„μ˜ λ‹€λ₯Έ λ°©μ‹μ˜ 접근이 ν•„μš”ν•©λ‹ˆλ‹€.

μš°μ„  이 μ™€μΌλ“œμΉ΄λ“œλ₯Ό μ–΄λ–€ μ‹μœΌλ‘œ μ²˜λ¦¬ν• μ§€ κ²°μ •ν•΄μ•Όν•©λ‹ˆλ‹€.

각각의 μ™€μΌλ“œ μΉ΄λ“œλŠ” ( ν˜Ήμ€ ) ν˜Ήμ€ 빈칸 으둜 μ‚¬μš©λ  수 μžˆμœΌλ―€λ‘œ
ν˜„μž¬ κ΄„ν˜Έ μŠ€νƒμ„ κ°€μ§€κ³ λŠ” μ–΄λ–€ λ°©μ‹μœΌλ‘œ μ‚¬μš©ν•΄μ•Όν• μ§€ μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ ν•΄λ‹Ή μ™€μΌλ“œ μΉ΄λ“œλŠ” λ‹€μŒ μ„Έ 가지 경우둜 μ‚¬μš© 방법을 λ‚˜λˆŒ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

  • * 보닀 μ•žμ„œ 발견된 ( 문자의 ) μ—­ν• 
  • * 보닀 늦게 발견된 ) 문자의 ( μ—­ν• 
  • 아무 역할도 ν•˜μ§€ μ•ŠλŠ” 빈칸

 

λ‹€μ‹œ 말해 ) λ¬Έμžμ— λŒ€μ‘λ˜λŠ” ( κ°€ 이전에 μŠ€νƒμ— μ‘΄μž¬ν•˜μ§€ μ•Šμ„ 경우 * λ₯Ό λŒ€μ‹  μ‚¬μš©ν•˜λ„λ‘ ν•˜λ©΄ λ©λ‹ˆλ‹€.
λ”°λΌμ„œ 큐 에 * λ¬Έμžκ°€ 발견된 μˆœμ„œλ‘œ 집어넣고 ν™œμš©ν•˜λ„λ‘ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

( 문자의 경우 λͺ¨λ“  문자λ₯Ό μˆœνšŒν•œ λ’€ μŠ€νƒμ— λ‚¨μ•„μžˆλŠ” 것이 μžˆλ‹€λ©΄ * 문자둜 ) 역할을 ν•  수 μžˆλŠ”μ§€ νŒλ‹¨ν•©λ‹ˆλ‹€.
이 경우 * λ¬Έμžκ°€ μŠ€νƒμ— μ‘΄μž¬ν•˜λŠ” ( 보닀 λ‚˜μ€‘μ— λ°œκ²¬λ˜μ–΄μ•Ό ν•˜λ―€λ‘œ 인덱슀λ₯Ό λΉ„κ΅ν•˜μ—¬ κ²°μ •ν•˜λ„λ‘ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

μ½”λ“œ

/**
 * @param {string} s
 * @return {boolean}
 */
var checkValidString = function (s) {
  const stack = [];
  const asterisk = [];

  for (let i = 0; i < s.length; i++) {
    if (s[i] === "(") {
      stack.push(i);
    } else if (s[i] === ")") {
      if (stack.length) {
        stack.pop();
      } else {
        if (asterisk.length) {
          asterisk.shift();
        } else {
          return false;
        }
      }
    } else {
      asterisk.push(i);
    }
  }

  // '(' κ°€ μŠ€νƒμ— λ‚¨μ•„μžˆλŠ” 경우 μ™€μΌλ“œ μΉ΄λ“œ μ‚¬μš© κ°€λŠ₯μ„± νŒλ‹¨
  for (let i = asterisk.length; i > 0; i--) {
    if (!stack.length) {
      return true;
    }
    if (asterisk[asterisk.length - 1] > stack[stack.length - 1]) {
      stack.pop();
    }
    asterisk.pop();
  }

  return stack.length === 0;
};

const input = "(())((())()()(*)(*()(())())())()()((()())((()))(*";
console.log(checkValidString(input));
λ°˜μ‘ν˜•

'πŸƒ algorithm > leetcode' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

LeetCode 543 - Diameter of Binary Tree (Easy)  (1) 2021.03.02
LeetCode 283 - Move Zeroes (Medium)  (0) 2021.03.02
LeetCode 1094 - Car Pooling (Medium)  (0) 2021.03.02
LeetCode 49 - Group Anagrams (Medium)  (0) 2021.03.02
LeetCode 200 - Number of Islands (Medium)  (0) 2021.03.02

πŸ’¬ λŒ“κΈ€