알고리즘/백준 문제풀이

[C++/BOJ] 백준 4949 균형잡힌 세상(스택)

개발자 덕구🐾 2021. 8. 7. 21:48
728x90

https://www.acmicpc.net/problem/4949

 

4949번: 균형잡힌 세상

하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마

www.acmicpc.net

 

풀이 방법 : 

 

띄어쓰기(공백문자)와 함께 문자들을 입력받는다.

그 후 한 글자(char)씩 ()[]를 구별하여 짝이 맞는지 확인하고 

맞으면 yes, 아니면 no을 출력한다.

 

 

정답코드 : 

 

#include<iostream>
#include<string> // getline을 위해
#include<stack>
using namespace std;
bool isok;
int main() {
    while (1) {
        isok = true;
        stack<int> stk;
        string str;
        getline(cin, str); // 띄어쓰기도 입력받음
        if (str == ".") break; // while문 밖으로
        for (char c : str) { // for each문 //한글자씩
            if (c == '(') stk.push('(');
            else if (c == '[') stk.push('[');
            else if (c == ')') {
                if (stk.empty()) {
                    isok = false;
                    break;
                }
                else {
                    if (stk.top() == '(') stk.pop();
                    else break;
                }
            }
            else if (c == ']') {
                if (stk.empty()) {
                    isok = false;
                    break;
                }
                else {
                    if (stk.top() == '[') stk.pop();
                    else break;
                }
            }
        }
        while (!stk.empty()) {
            isok = false;
            stk.pop();
        }
        if (isok) cout << "yes" << "\n";
        else cout << "no" << "\n";
    }
}

 

 

자세한 풀이 : 

 

1) while을 이용하여 무한루프를 돌린다.

 

2) getline으로 문장을 입력받는다.

 

3) 문장이 아니라 "."일경우 break를 통해서 while 무한 루프를 빠져나간다.

 

4) for each문을 이용하여 char 하나씩 비교한다.

 

5) stack은 재사용해야하고 남은게 있다면 false이므로

   empty()가 될때까지 pop()을 해준다.

 

6) bool 형식의 변수가 true라면 yes를 false라면 no를 출력한다.

 

 

주의할것 & 새롭게 배운것 :

getline(cin,str)

=> 공백문자 즉 띄어쓰기를 포함하는 string을 입력받을때 사용한다.

=> 사용하기위해선 #include<string>을 해야한다.

 

 

"."과 '('이 큰따움표와 작은따움표의 차이

=>  c++에서는 string의 경우 ""[큰따움표]를 사용한다.

=> char의 경우 ''[작은 따움표]를 사용한다.

 

코드의 경우

"."은 string으로서 비교가 되었기에 ""큰따움표로 입력되었고

for each문 내부에서는 한글자씩 char로 비교되었기 때문에 ''작은따움표를 사용한것이다.

 

반응형