프로그래머스의 올바른 괄호(Lv2) 문제이다.


[ 문제풀이 ]

주어진 괄호가 올바른지 아닌지 판단해주면 되는 문제이다.

올바른 괄호이기 위해서는 닫는괄호 ')' 가 나왔을 때, 그 전에 한번이라도 여는 괄호 '(' 가 존재해야 한다.

따라서 '(' 괄호가 나왔을 때는 '('괄호의 갯수를 Count해주는 변수를 ++ 시켜 주었다.

반대로 ')'괄호가 나왔을 때는 '('괄호의 갯수를 Count해준 변수의 값이 0인지 아닌지 판단해 주면 된다.

만약 0이라면, 기존에 여는 괄호가 나오지 않았음을 의미하기 때문에 올바르지 않은 괄호인 것이다.

그대로 false를 return 시켜주면 된다.

하지만, 0이 아니라면 기존에 한번이라도 여는 괄호가 나왔다는 것을 의미하고, 해당 변수의 값을 -- 시켜주었다.

왜냐하면, ()) 와 같은 경우를 보게되면, '(' 와 ')' 를 통해서 이미 여는 괄호가 하나 상쇄되어 버렸다.

그 이후에 오는 마지막에 있는 ')' 괄호 입장에서는 그 전에 여는 괄호가 없었다 라고 판단을 해야 하기 때문에

변수의 값을 -- 시켜 준 것이다.


또한 최종적으로, '(' 괄호의 갯수를 Count해주는 변수의 값이 0인지 판단해 주어야 한다.

이런 경우를 한번 생각해보자.

( ) ( ) (

0번째와 1번째 괄호가 서로 상쇄 , 2번째와 3번째 괄호가 서로 상쇄, 마지막 4번째 괄호는 상쇄되지 않는다.

따라서 올바르지 않은 괄호임에도 불구하고, 닫는 괄호가 나오지 않아서 위에서 말한 올바른 괄호인지 아닌지

판단을 못한 채, 반복문이 끝나버리는 경우가 발생한다.

따라서 마지막으로 Count해주는 변수의 값 또한 체크해 주어야 한다.


[ 소스코드 ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<string>
 
using namespace std;
 
bool solution(string s)
{
    bool answer = true;
    int Cnt = 0;
    for(int i = 0 ; i  < s.length(); i++)
    { 
        if (s[i] == '(') Cnt++;
        else
        {
            if (Cnt == 0return false;
            Cnt--;
        }
    }
    if (Cnt != 0return false;
    return true;
}
cs


+ Recent posts