[백준/C++]#9012 - 올바른 괄호 문제

2021. 1. 12. 15:05필요/코딩테스트(백준)

 

풀이

#include<iostream>
#include<string>
using namespace std;
 
int main() {
    int n,cnt;
    string s;
    cin >> n;
    for (int i=1;i<=n;i++) {		// n번의 문자열 입력받음
        cin >> s;
        cnt = 0;
        for (int j=0; j < s.size(); j++) {		// 각 성분을 비교하기 위해 배열의 크기만큼 반복
            if (s[j] == '(') {
                cnt++;
            }
            else cnt--;
            if (cnt < 0) break;
        }
        if (cnt == 0) cout << "YES" << "\n";
        else cout << "NO" << "\n";
    }
        return 0;
}

C++ 개념

새롭게 사용한 것으로는, 배열의 크기를 의미하는 String의 클래스 함수 s.size()를 사용했다.


풀이

괄호가 올바르게 사용되려면 몇가지 규칙을 따라야한다.

일단 '(' ')'의 짝이 맞아야한다. '('이 입력될때는 cnt 변수에 +1을 하고, ')'이 입력될때는 -1을 하여 한 줄이 끝났을 때 cnt가 0인지 그렇지 아닌지를 if문을 통해 확인할 수 있다.

그 외의 괄호가 부적절하게 사용된 경우는, '(' 이전에 ')'가 오는 조건이다. cnt가 -1이 될때가 바로 그러한 상황이다.

따라서 두번째 for문 안에서 cnt의 계산이 진행될 때, cnt의 값이 0보다 작아지면 for문을 break 하게 설정했다.


+a

실수한 부분이 꽤나 있었다. 실수한 부분을 한번에 모아서 코드를 구성해보았다.

#include<iostream>
#include<string>
using namespace std;
 
int main() {
    int n,i,j,cnt=0;
    string s;
    cin >> n;
    for (i=1;i<=n;i++) {
        cin >> s[j];					// 입력을 배열 성분별로 받았다.
        for (j=0; s[j]!='\0'; j++) {	// '\0'(NULL) 값이 될 때 종료되게 설정했다.
            if (s[j] == '(') {
                cnt++;
            }
            else cnt--;
            if (cnt < 0) break;
        }
        if (cnt == 0) cout << 'YES' << '\n';	// 큰 따옴표가 아닌 작은 따옴표를 사용했다. 
        else cout << 'NO' << '\n'; 
    }
        return 0;
}

일단 s.size() 함수의 존재를 생각하지 못했다. 따라서 두번째 for문의 반복 조건을 배열의 성분이 NULL 값이 아닐 때로 설정했다. 이렇게 실행을 하면 Runtime error가 발생한다. 입력하지 않은 성분에는 NULL 값이 아니라 임의의 Trash 값이 들어가기 때문이다. 따라서 이런식으로 해결하려면, 앞서 s의 값을 모두 NULL로 초기화했으면 될 것 같다.

 

그리고 실수한 부분은, 마지막 if문이다. 'YES'를 출력하면 5850451이 출력된다. 작은 따옴표를 사용하면 문자가 숫자로 바뀌어서 출력되고, 큰 따옴표를 사용해야 문자를 출력할 수 있다.