[Stack] Valid Parantheses

Jeenieยท2025๋…„ 5์›” 5์ผ
post-thumbnail

https://leetcode.com/problems/valid-parentheses

์›๋ฆฌ

๋ฌธ์ œ์˜ ํ•ต์‹ฌ : ๊ด„ํ˜ธ์˜ ์ง์„ ๋งž์ถ”์–ด๋ผ

์ฒซ ์‹œ๋„ (ํ‹€๋ฆผ)

์ฒ˜์Œ์—๋Š” โ€œ์—ด๋ฆฐ ๊ด„ํ˜ธ๊ฐ€ ๋‚˜์˜ค๋ฉด ๊ทธ ๋’ค์— ๋”ฐ๋ผ์˜ค๋Š” ๊ด„ํ˜ธ๋Š” ๋ฐ˜๋“œ์‹œ ๊ทธ ์ง์ด์–ด์•ผํ•œ๋‹คโ€๋ผ๋Š” ์ •์˜๋ฅผ ๋‚ด๋ฆฌ๊ณ  ์ธ๋ฑ์Šค๋กœ ํ•ด๊ฒฐํ•ด๋ณด๋ ค๊ณ  ์ ‘๊ทผํ–ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์น˜๋ช…์ ์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ
์ˆœ์„œ๋Œ€๋กœ ์˜ค๋Š” []{}()๋Š” ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์ง€๋งŒ nested๋œ [{()}]๋Š” ๊ฒ€์ฆํ•  ์ˆ˜ ์—†์—ˆ๋‹ค

ํ•ด์„ค

โ€œ์—ด๋ฆฐ ๊ด„ํ˜ธ๊ฐ€ ๋‚˜์˜ค๋ฉด ๊ทธ ๋’ค์— ๋”ฐ๋ผ์˜ค๋Š” ๊ด„ํ˜ธ๋Š” ๋ฐ˜๋“œ์‹œ ๊ทธ ์ง์ด์–ด์•ผํ•œ๋‹คโ€๋ผ๋Š” ํ•ด๋‹ต์€ ์„ฑ๋ฆฝํ•  ์ˆ˜ ์—†๋‹ค.

์™œ๋ƒ๋ฉด (){}[] ๋งŒ ์ •๋‹ต์ด ์•„๋‹ˆ๊ณ , ({[]}) ์ด๋ ‡๊ฒŒ๋„ ์ •๋‹ต์ด๊ธฐ ๋•Œ๋ฌธ์—.

Stack ๊ตฌ์กฐ๋กœ ๊ฐ„๋‹จํžˆ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ!

๋”ฐ๋ผ์„œ ์—ด๋ฆฐ ๊ด„ํ˜ธ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ stack์— ์ถ”๊ฐ€ํ•˜๊ณ , ๋‹ซํžŒ ๊ด„ํ˜ธ๊ฐ€ ๋‚˜์˜ค๋ฉด, ์Šคํƒ์˜ ์ œ์ผ ์ตœ๊ทผ์— ์ถ”๊ฐ€๋œ ๋งจ ๋งˆ์ง€๋ง‰(๋งจ ์œ„) ์š”์†Œ๊ฐ€ "("์—ฌ์•ผํ•œ๋‹ค.

๋‹ซํžŒ ๊ด„ํ˜ธ๊ฐ€ ๋‚˜์™”์„ ๋•Œ ์Šคํƒ์—์„œ ๋งจ ๋งˆ์ง€๋ง‰์— ์žˆ๋Š” ์š”์†Œ๊ฐ€ ํ•ด๋‹น ๋‹ซํžŒ ๊ด„ํ˜ธ์˜ ์ง์ด ๋งž๋Š”์ง€๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ

์˜ˆ์‹œ: s = "({[]})"

๋ฌธ์ž์Šคํƒ ์ƒํƒœ์„ค๋ช…
([(]์—ฌ๋Š” ๊ด„ํ˜ธ๋‹ˆ๊นŒ push
{[(, {]์—ฌ๋Š” ๊ด„ํ˜ธ๋‹ˆ๊นŒ push
[[(, {, []์—ฌ๋Š” ๊ด„ํ˜ธ๋‹ˆ๊นŒ push
][(, {][์˜ ๋‹ซํž˜์ด๋‹ˆ๊นŒ pop, ์ง์ด ๋งž์Œ โœ…
โ†’ Stack์—์„œ ์ œ๊ฑฐํ•œ๋‹ค
}[(]{์˜ ๋‹ซํž˜์ด๋‹ˆ๊นŒ pop, ์ง์ด ๋งž์Œ โœ…
โ†’ Stack์—์„œ ์ œ๊ฑฐํ•œ๋‹ค
)[](์˜ ๋‹ซํž˜์ด๋‹ˆ๊นŒ pop, ์ง์ด ๋งž์Œ โœ…
โ†’ Stack์—์„œ ์ œ๊ฑฐํ•œ๋‹ค

โ†’ ์Šคํƒ์ด ์™„์ „ํžˆ ๋น„์—ˆ์œผ๋ฏ€๋กœ, ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด

์ดˆ๊ธฐ์ œ์ถœ


// Stack ๊ตฌ์กฐ๋กœ ํ’€๊ธฐ
var isValid = function (s) {
    // 1. ์—ด๋ฆฐ ๊ด„ํ˜ธ๊ฐ€ ๋‚˜์˜ค๋ฉด Stack์— ์ถ”๊ฐ€ํ•œ๋‹ค
    // 2. ๋‹ซํžŒ ๊ด„ํ˜ธ๊ฐ€ ๋‚˜์˜ค๋ฉด stack์˜ ๋งจ ๋งˆ์ง€๋ง‰ ์š”์†Œ์™€ ๋น„๊ต. ๋ฐ˜๋“œ์‹œ ์ง์ด์–ด์•ผํ•œ๋‹ค
    // 3. ์ง์ด ๋งž๋‹ค๋ฉด stack์—์„œ ์ œ๊ฑฐ
    // 4. ๋ฐ˜๋ณต๋ฌธ์ด ๋๋‚œ ์ดํ›„์—๋„ stack์— ๊ฐ’์ด ๋‚จ์•„์žˆ๋‹ค๋ฉด false, ๋น„์–ด์žˆ๋‹ค๋ฉด true

    const input = s.split("")
    console.log("input", input)
    const stack = []
    input.map((el) => {
        console.log("el", el)
        if (el === "(" || el === "{" || el === "["){
            console.log("์—ด๋ฆฐ ๊ด„ํ˜ธ์ž…๋‹ˆ๋‹ค", el,stack)
            stack.push(el)
        } else {
            console.log("๋‹ซํžŒ ๊ด„ํ˜ธ์ž…๋‹ˆ๋‹ค",el)
            if(PAIR[el] === stack[stack.length - 1]) {
                // stack์˜ ๋งจ ๋งˆ์ง€๋ง‰ ์š”์†Œ์™€ ๋น„๊ต, PAIR์™€ ์ผ์น˜ํ•ด์•ผํ•œ๋‹ค
                console.log("์ง์ด ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค")
                stack.pop()
            }
        }
        })
        return stack.length === 0
};

๋‚ด ํ’€์ด ๋‚ด์—ญ๊ณผ ํ”ผ๋“œ๋ฐฑ

var isValid = function (s) {
    // 1. ์—ด๋ฆฐ ๊ด„ํ˜ธ๊ฐ€ ๋‚˜์˜ค๋ฉด Stack์— ์ถ”๊ฐ€ํ•œ๋‹ค
    // 2. ๋‹ซํžŒ ๊ด„ํ˜ธ๊ฐ€ ๋‚˜์˜ค๋ฉด stack์˜ ๋งจ ๋งˆ์ง€๋ง‰ ์š”์†Œ์™€ ๋น„๊ต. ๋ฐ˜๋“œ์‹œ ์ง์ด์–ด์•ผํ•œ๋‹ค
    // 3. ์ง์ด ๋งž๋‹ค๋ฉด stack์—์„œ ์ œ๊ฑฐ
    // 4. ๋ฐ˜๋ณต๋ฌธ์ด ๋๋‚œ ์ดํ›„์—๋„ stack์— ๊ฐ’์ด ๋‚จ์•„์žˆ๋‹ค๋ฉด false, ๋น„์–ด์žˆ๋‹ค๋ฉด true
    const input = s.split("")
    console.log("input", input)
    const stack = []
    input.map((el) => {
        console.log("el", el)
        if (el === "(" || el === "{" || el === "["){
            console.log("์—ด๋ฆฐ ๊ด„ํ˜ธ์ž…๋‹ˆ๋‹ค", el,stack)
            stack.push(el)
        } else {
            console.log("๋‹ซํžŒ ๊ด„ํ˜ธ์ž…๋‹ˆ๋‹ค",el)
            if(PAIR[el] === stack[stack.length - 1]) {
                // stack์˜ ๋งจ ๋งˆ์ง€๋ง‰ ์š”์†Œ์™€ ๋น„๊ต, PAIR์™€ ์ผ์น˜ํ•ด์•ผํ•œ๋‹ค
                console.log("์ง์ด ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค")
                stack.pop()
            }
        }
        })
        return stack.length === 0
};

chatGPT์˜ ํ”ผ๋“œ๋ฐฑ

  • ( ๋Š” ์Šคํƒ์— ๋“ค์–ด๊ฐ โ†’ stack = ["("]
  • ] ๊ฐ€ ๋‚˜์˜ค๋ฉด PAIR[']']๋Š” '['์ด์ง€๋งŒ stack[stack.length - 1]์€ '(' โ†’ ์ง์ด ์•ˆ ๋งž์Œ
  • ํ•˜์ง€๋งŒ ์ง€๊ธˆ ์ฝ”๋“œ๋Š” else ์กฐ๊ฑด ๋‚ด์—์„œ if (์ง์ด ๋งž์„ ๋•Œ)๋งŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ง์ด ์•ˆ ๋งž์„ ๊ฒฝ์šฐ ๊ทธ๋ƒฅ ๋ฌด์‹œํ•˜๊ณ  ๋„˜์–ด๊ฐ€์š”
  • ๊ทธ๋ž˜์„œ ์Šคํƒ์— "("๊ฐ€ ๋‚จ์€ ์ฑ„ stack.length !== 0, ๊ฒฐ๊ณผ๋Š” false๊ฐ€ ๋‚˜์˜ค๊ธด ํ•˜๋Š”๋ฐโ€ฆ
    • ๋” ๋ณต์žกํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์—์„œ๋Š” ์ž˜๋ชป๋œ ๋™์ž‘์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์–ด์š”
    • ๋ฌด์—‡๋ณด๋‹ค ์ง์ด ์•ˆ ๋งž๋Š” ์ˆœ๊ฐ„ ์ฆ‰์‹œ false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒŒ ์ •ํ™•ํ•˜๊ณ  ๋น ๋ฆ…๋‹ˆ๋‹ค

๐Ÿ’ก map์€ ๋ฐ˜๋ณต ์šฉ๋„๊ฐ€ ์•„๋‹ˆ๋‹ค

map ๋Œ€์‹  for-of์„ ์“ฐ๋Š” ์ด์œ ?
map์€ ๋ฐฐ์—ด์„ ๋ณ€ํ˜•ํ•  ๋•Œ ์“ฐ๋Š” ํ•จ์ˆ˜์—์š”. (return ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์š”)
ํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ๋Š” ๊ฐ’์„ ๋ณ€ํ˜•ํ•˜์ง€ ์•Š๊ณ , ๋‹จ์ˆœ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์Šคํƒ์„ ์กฐ์ž‘ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ผ์š”.
๊ทธ๋ž˜์„œ for-of์ด ๋” ์ ์ ˆํ•ด์š”. ๋” ์ง๊ด€์ ์ด๊ณ  ์„ฑ๋Šฅ๋„ ๋‚ซ์Šต๋‹ˆ๋‹ค.

๊ฐœ์„ 


// ๊ฐœ์„ ํ•˜๊ธฐ
var isValid = function (s) {
    // 1. ์—ด๋ฆฐ ๊ด„ํ˜ธ๊ฐ€ ๋‚˜์˜ค๋ฉด Stack์— ์ถ”๊ฐ€ํ•œ๋‹ค
    // 2. ๋‹ซํžŒ ๊ด„ํ˜ธ๊ฐ€ ๋‚˜์˜ค๋ฉด stack์˜ ๋งจ ๋งˆ์ง€๋ง‰ ์š”์†Œ์™€ ๋น„๊ต. ๋ฐ˜๋“œ์‹œ ์ง์ด์–ด์•ผํ•œ๋‹ค
    // 3. ์ง์ด ๋งž๋‹ค๋ฉด stack์—์„œ ์ œ๊ฑฐ
    // 4. ๋ฐ˜๋ณต๋ฌธ์ด ๋๋‚œ ์ดํ›„์—๋„ stack์— ๊ฐ’์ด ๋‚จ์•„์žˆ๋‹ค๋ฉด false, ๋น„์–ด์žˆ๋‹ค๋ฉด true

    const input = s.split("")
    console.log("input", input)
    const stack = []
    for (el of input) {
        console.log("el", el)
        if (el === "(" || el === "{" || el === "[") {
            console.log("์—ด๋ฆฐ ๊ด„ํ˜ธ์ž…๋‹ˆ๋‹ค", el)
            stack.push(el)
        } else {
            console.log("๋‹ซํžŒ ๊ด„ํ˜ธ์ž…๋‹ˆ๋‹ค", el)
            if(PAIR[el] === stack[stack.length - 1]) {
                console.log("์ง์ด ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค", el)
                stack.pop()
            } else {
                console.log("์ง์ด ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค", el)
                return false
              // ์—ฌ๊ธฐ์„œ false๋ฅผ ๊ตณ์ด ํ•ด์•ผํ•˜๋Š” ์ด์œ ?
              // ๋”์ด์ƒ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉฐ ๊ณ„์‚ฐํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ
            }
        }
    }
    return stack.length === 0
};

๋А๋‚€ ์ 

์ด๋ก ๋งŒ ์•Œ๊ณ ์žˆ๋˜ stack์„ ์ฒ˜์Œ ๊ตฌํ˜„ํ•ด๋ด์„œ ์ข‹์•˜๊ณ  ๋ฐ˜์„ฑํ–ˆ๋‹ค.
์ž๋ฃŒ๊ตฌ์กฐ์—์„œ ์Šคํƒ์€ ์—ฐํƒ„, ํ๋Š” ๋Œ€๊ธฐ์—ด์ด๋ผ๊ณ  ์ด๋ก ์ ์œผ๋กœ๋งŒ ์ƒ๊ฐํ–ˆ์—ˆ๋Š”๋ฐ
์ •๋ง๋กœ ์‹ค์ œ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ๋˜๋Š”๊ตฌ๋‚˜! ๊ณ  ๋А๊ผˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋– ์˜ฌ๋ฆฌ๋Š” ์—ฐ์Šต์ด ํ•„์š”ํ•˜๋‹ค....
์‚ฌ์‹ค ๊ทธ๊ฒŒ ์ œ์ผ ์–ด๋ ต๋‹ค

profile
Web Front-end developer

0๊ฐœ์˜ ๋Œ“๊ธ€