Skip to content

[Leetcode] 32. Longest Valid Parentheses โ€‹

Problem โ€‹

๋ฌธ์ œ ๋งํฌ

์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ๊ฐ€ ์—ฐ์†์ ์œผ๋กœ ๋‚˜์˜ค๋Š” ์ตœ๋Œ€ ๊ธธ์ด.

Solution โ€‹

์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ฐ˜๋ณต๋ฌธ์„ํ†ตํ•ด ์—ด๋ฆฐ๊ด„ํ˜ธ(left)์™€ ๋‹ซํžŒ๊ด„ํ˜ธ(right)์˜ ์Œ์ด ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

๋จผ์ € ์—ด๋ฆฐ๊ด„ํ˜ธ์—๋Œ€ํ•œ ์ตœ๋Œ€๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ  ๊ทธ ํ›„์— ๋‹ซํžŒ๊ด„ํ˜ธ์—๋Œ€ํ•œ ์ตœ๋Œ€๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•จ์œผ๋กœ์จ ๋ชจ๋“  ๊ด„ํ˜ธ๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค. ์—ด๋ฆฐ๊ด„ํ˜ธ์˜ ๊ฒ€์‚ฌ๋ฅผ ์‹œ์ž‘ํ• ๋•, ์—ด๋ฆฐ ๊ด„ํ˜ธ๋กœ ์‹œ์ž‘ํ•ด์•ผ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์ž„์œผ๋กœ right๊ฐ€ left๋ฅผ ๋„˜์ง€ ์•Š๋„๋ก(๋„˜์—ˆ๋‹ค๋ฉด ์นด์šดํŒ… x)ํ•œ๋‹ค. ์—ด๋ฆฐ ๊ด„ํ˜ธ๋กœ ์‹œ์ž‘ํ• ๋•Œ ๋‹ซํžŒ๊ด„ํ˜ธ์™€ ๊ฐ™์€ ๊ฐฏ์ˆ˜๋ฅผ ๊ฐ€์ง€๋Š” ์ˆœ๊ฐ„ ์˜ฌ๋ฐ”๋ฅธ ๋ฌธ๋ฒ•์˜ ๋์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋•Œ ๊ด„ํ˜ธ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ตœ๋Œ€๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ๋ฐ˜๋ณต๋ฌธ์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋‹ซํžŒ๊ด„ํ˜ธ์—๋Œ€ํ•œ ์—ด๋ฆฐ๊ด„ํ˜ธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜์—ฌ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•œ๋‹ค.

JS Code โ€‹

js
/**
 * @param {string} s
 * @return {number}
 */
var longestValidParentheses = function(s) {
    
    let left = 0, right = 0 
    let answer = 0
    
    for(let i = 0 ; i < s.length; i++) {
        if (s[i] === '(') left++
        else if(s[i] === ')') right++
        
        if (left === right) answer = Math.max(answer, right * 2)
        else if(left < right) left = right = 0
    }
    
    left = right = 0
    
    for(let i = s.length-1 ; 0 <= i ; i--) {
        if (s[i] === '(') left++
        else if (s[i] === ')') right++
        
        if (left === right) answer = Math.max(answer, left * 2)
        else if (left > right) left = right = 0
    }
    
    return answer
};