[프로그래머스 고득점 Kit] 올바른 괄호 C++ 문제 풀이

반응형
반응형

#INFO

분류 : 스택/큐

난이도 : LEVEL2

출처 : https://school.programmers.co.kr/learn/courses/30/lessons/12909

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


#SOLVE

간단한 스택 문제 입니다.

주어진 문자열 s가 올바른 괄호 인지를 판별해야 합니다. (올바른 괄호란 여는 괄호 '(' 로 시작해 닫는 괄호 ')' 로 끝나는 문자열입니다. 에를들어 )( 는 올바른 괄호가 될 수 없습니다.)

 

문제 풀이 아이디어는 간단합니다.

우선, 문자열 s의 각 괄호를 저장할 char형 스택을 하나 선언합니다.

stack<char> stk;

 

다음으로 문자열 s를 순회하며 왼쪽 괄호 '(' 인 경우에는 스택에 푸시합니다. 

 

오른쪽 괄호 ')' 인 경우에는 두 가지 케이스로 나뉩니다.

첫 번째 케이스는 오른쪽 괄호 ')'이고, 스택이 비어있지 않은 케이스 입니다. 

이 때 왼쪽 괄호를 스택에서 pop 합니다.

 

두 번째 케이스는 오른쪽 괄호 ')' 이고, 스택이 비어있는 케이스 입니다. 

스택에 오른쪽 괄호 ')'를 그냥 푸시합니다. 

 

이제 오른쪽 괄호가 스택에 하나라도 push가 된 이상, 왼쪽 괄호 '(' 혹은 오른쪽 괄호 ')' 가 아무리 들어와도 스택이 비는 경우가 발생하지 않습니다. 즉, 스택이 비어있지 않으면 올바르지 않은 괄호가 됩니다. 

 

위 과정을 코드로 나타내면 다음과 같습니다.

    for(const auto& i : s){
        if(i == '(') stk.push('(');
        else if(i == ')'){
            if(!stk.empty()){ 
                stk.pop();
            }
            else{ 
                stk.push(')');
            }
        }
    }
    if(!stk.empty()) answer = false;

#CODE

#include <string>
#include <iostream>
#include <stack>
using namespace std;

bool solution(string s)
{
    bool answer = true;
    stack<char> stk;
    for(const auto& i : s){
        if(i == '(') stk.push('(');
        else if(i == ')'){
            if(!stk.empty()){ 
                stk.pop();
            }
            else{ 
                stk.push(')');
            }
        }
    }
    if(!stk.empty()) answer = false;
    return answer;
}
반응형

댓글

Designed by JB FACTORY