[프로그래머스] Lv.2 올바른 괄호- C++

potatoj11n·2024년 2월 5일

프로그래머스

목록 보기
19/25
post-thumbnail

문제 설명

Lv.2 올바른 괄호

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어
- "()()" 또는 "(())()" 는 올바른 괄호입니다.
- ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.

'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

제한사항

  • 문자열 s의 길이 : 100,000 이하의 자연수
  • 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

입출력 예

sanswer
"()()"true
"(())()"true
")()("false
"(()("false

입출력 예 설명

입출력 예 #1,2,3,4
문제의 예시와 같습니다.

풀이

🔥 문제 요약:

문자열에 괄호를 입력 받아서 ( ) 쌍이 이뤄지는 지 확인해서 올바른 괄호인지 판단하는 문제

🤔 생각할 점

스택을 사용해서 들어온 문자열이 ( 인 경우에 스택에 넣어주고 ) 인 경우에는 스택에 넣지 않는다.

  • for문을 돌면서 ( 인 경우에만 스택에 push
  • ) 인 경우에는 스택이 비어있는지 확인 스택이 비어있다면 이전 괄호가 ) 였다는 걸 의미한다. ( 보다 ) 가 많아졌으니 올바르지 않은 괄호이기 때문에 false를 return 스택이 비어있지 않다면 전 괄호가 ( 였다는 걸 의미하니까 () 올바른 괄호가 성립했으니 pop으로 다시 비워준다.
  • for문을 빠져 나왔을 때 스택의 사이즈를 확인 스택이 비어있다면 올바른 괄호 성립한 것이고 스택이 비어있지 않다면? 올바르지 않은 괄호이다.
#include <iostream>
#include<string>
#include<stack>

using namespace std;

bool solution(string s)
{
    stack<char> str;

    for(char& c : s)
    {
        if(c=='(')
        {
            str.push(c);
        }
        
        else if(c==')')
        {
            if(str.empty())
            {
                return false;
            }
            else
            {
                str.pop();
            }
        }
    }
    return str.empty();
}

✅ 문자열 S의 각 문자 마다 검사

for(char& c : s)

✅ ( 가 들어오면 스택에 해당 문자를 넣어준다.

		if(c=='(')
        {
            str.push(c);
        }

✅ ) 가 들어왔을 때 스택이 비어있다면 (가 들어오지 않았다는 뜻→ 올바르지 않은 괄호

비어있지 않다면 올바른 괄호니까 스택을 비워줌

 else if(c==')')
        {
            if(str.empty())
            {
                return false;
            }
            else
            {
                str.pop();
            }
        }

✅ 스택이 비어있는지 여부를 반환 ( 비어있다면 올바른 괄호인 것이다.)

0개의 댓글