ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [STACK] BOJ 9012 번 문제풀이
    백준 문제풀이/etc 2019. 5. 12. 00:33

    문제분석

     

    굉장히 읽기 싫을 정도로 긴 문제지만

    결국 소괄호가 한쌍으로 존재하는 가? 

    를 묻는 문제네요. ㅎㅎ

     

    알고리즘 문제를 풀 때, 접근법이 굉장히 중요한 게

    제가 처음에 이 문제를 접근하는 

    방법은 이렇습니다.

     

    '(' , ')' 두 개의 개수를 카운트해서

    같으면 VPS 이다 ~ 

     

    라고 접근했습니다.

    이 방법 역시 그렇게 어렵진 않지만

    굉장히 단순 무식한 방법 같았습니다.

     

    그래서 다른 분들의 코드를 보니

    세상에 천재들이 많더군요.

     

    개발자 지망생 김 모 씨의 접근법은 이렇습니다.

     

    여는 괄호 '(' 가 나오면 무조건 스택에 PUSH 하고

    닫는 괄호 ')' 가 나왔을 때,

    배열 안에 여는 괄호 '(' 가 존재하면 스택에서 POP 하고

    배열이 비어있다면 FALSE  하는 겁니다.

     

    같은 문제를 이렇게 구현할 수 있다는 점에서 

    정말 놀랐습니다.... 

     

    어쨌든 이 문제는 이런 식으로 

    한 줄 한줄 문자열을 받아서

    해당 문자열이 VPS 인지 판별한 후 

    YES or NO 를 출력하는 문제였습니다.

     

     

    코드

     

    #include "bits/stdc++.h"
    
    using namespace std;
    
    bool compare(string str)
    {
    	int len = (int)str.length();
    	stack<char> arr;
    
    	for (int i = 0; i < len; i++)
    	{
    		char c = str[i];
    
    		if (c == '(') arr.push(str[i]);
    		else
    		{
    			if (!arr.empty()) arr.pop();	
    			else return false;
    		}
    	}
    	return arr.empty();
    }
    int main()
    {
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	string str;
    	int n;
    	cin >> n;
    	for (int i = 0; i < n; i++)
    	{
    		cin >> str;
    		if (compare(str)) cout << "YES" << '\n';
    		else cout << "NO" << '\n';
    	}
    	return 0;
    } 

    댓글

Designed by Tistory.