개발조각

[리트코드] 20. Valid Parentheses 본문

알고리즘🅰/리트코드

[리트코드] 20. Valid Parentheses

개발조각 2022. 9. 22. 19:04
728x90
반응형

안녕하세요. 개발조각입니다.😊

이번 문제는 알고리즘 문제 풀면 무조건 보는 문제인 것 같아요.

저도 이전에 프로그래머스에서 풀었었는데 또 보니까 반갑네요.


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

 

Valid Parentheses - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

이번 문제는 쉬우니 빠르게 해결방안에 대해 설명하겠습니다.

 

해결방안

var isValid = function(s) {
    bracketMap = {
        '(':')',
        '{':'}',
        '[':']',
    };
    
    branckes = [];
    for(i of s){
        let len = branckes.length;
        if(bracketMap[i]) branckes.push(i);
        else{
            if(!len) return false;
            
            if(i === bracketMap[branckes[len-1]]) branckes.pop();
            else return false;
        }        
    }
    
    return branckes.length ? false : true;
};

 

간단하게 개념에 대해 설명을 하자면

branckes = []를 만들어

  • '(', '{', '['일 경우 branckes에 넣어주고
  • ')', '}', ']'일 경우 branckes의 마지막 원소가 ')', '}', ']'에 짝에 맞는 '(', '{', '['이면 제거를 해줍니다.
    • 짝이 안맞을 경우는 괄호의 짝이 안 맞는 경우이기 때문에 바로 false를 해줍니다.

 

왜 이렇게 했는지는 아래 이미지를 보시면 알 것 같습니다.

이렇게 진행을 하면 짝이 맞는 괄호이면

brancket = [ ] 이렇게 빈배열로 나오고 아닐 경우는 brancket배열 안에 원소가 있겠죠.

 

사실 위에있는 설명대로 코드를 짜면 통과는 되겠지만

효율을 위해 중간에 false가 될 수 있을 값을 미리 제거를 해줘야 됩니다.

예를 들어 아래와 같은 경우가 있습니다.

  • ){}

이와같이 s[0]이 '(', '{', '['이 아닌 ')', '}', ']'경우에는 짝이 맞는 괄호인지 확인할 필요도 없겠죠.

 


bracketMap = {
    '(':')',
    '{':'}',
    '[':']',
};

문제가 단순하게 ()만 써서 맞는 괄호인지 찾는 문제면 안써도 되는데

이번 문제는 (), {}, []이렇게 3가지를 괄호의 짝이 맞는지 찾는 문제라 object형태로 나타냈습니다.

 

 

branckes = [];
for(i of s){
    let len = branckes.length;
    if(bracketMap[i]) branckes.push(i);
    else{
        if(!len) return false;

        if(i === bracketMap[branckes[len-1]]) branckes.pop();
        else return false;
    }        
}

for of문을 사용해서 문자열s의 각각의 괄호가 나오게 해주었고

 

 

if(bracketMap[i]) branckes.push(i);

이러한 조건문을 넣어

'(', '{', '[' 경우에 branckes배열에 넣어주었습니다.

 

 

else{
    if(!len) return false;

    if(i === bracketMap[branckes[len-1]]) branckes.pop();
    else return false;
}

else경우는 ')', '}', ']'일 경우겠죠

 

if(!len) return false;

이전에 '){}' 와 같은 테스트 케이스도 발생할 수 있기 때문에 이와 같은 조건을 넣어주었습니다.

 

if(i === bracketMap[branckes[len-1]]) branckes.pop();
else return false;

그리고 해당 괄호가 짝이 맞는지 확인하고 맞으면 branckes의 마지막 원소를 제거하고

아닐 경우 false를 리턴해주었습니다.

 

 

return branckes.length ? false : true;

마지막으로  s='{{{{{{{{'일 경우도 존재하니 이와같은 조건문을 써주었습니다.

 

728x90
반응형
Comments