[백준] 균형잡힌 세상 - C++

JINJU·2021년 4월 21일
0

균형잡힌세상 풀러가기~

문제 풀게된 계기

엊그제 풀던 문제 마저 풀기 ㅎㅎ

다 풀고 제출했어야하지만 코딩테스트와 최종면접 후에 풀어져가는

나의 마음가짐을 다시 잡기 ㅠㅠ

SV 코테 붙었음 좋겠다 ㅠ_ㅠ 면접 보고 시퍼여 ㅠㅠ

가고 시퍼요 o̴̶̷᷄﹏o̴̶̷̥᷅

문제 해결 방법

문제는 해당 문자열이 있을 경우

() 소괄호와 [] 대괄호가 있을 때 균형이 잡혀야하고,

괄호 안의 문자열마저도 균형이 잡혀야 한다.

이 방법을 나는 stack을 사용해서 풀었다.

저번에 비슷한 괄호 문제에서는 괄호의 갯수에 맞게 했는데

stack을 사용하여 괄호의 균형이 맞는지 보면 되기때문에 사용한다!

방법

  1. 제일 먼저 getline()을 사용해서 개행문자까지 받는다.

  2. 받은 문자열을 length()만큼 for문을 사용해서 조건에 따라 stack에 Push or pop

  3. ( or [를 만나면 push

  4. ) or ]를 만나게 되면 stack이 비어있지 않고 닫는 괄호에 맞게 ( 나 [가 스택의 top에 있으면 pop

  5. 그렇지 않은경우 result 결과를 NO로 하여 최종 결과에 반영

근데 문제를 풀면서 겪은 것은

20퍼에서 계속 틀렸습니다가 떴다.


그래서 왜 그런지 모든 반례를 다 햇는데도 뭔가 했는데

역시 컴퓨터는 거짓말을 하지 않음..

문제는 for문을 length()만큼 다 돌고 나오면

yes or no에 맞게 출력하는 부분에서

나는 모든 문자의 마지막은 "."으로 끝나야하는줄 알고

 if (str[str.length()-1] != '.') result = "no";
 cout << result << endl;

입력 문자열의 마지막이 "."이 아니면 no를 출력하게 끔 구성했다.

그치만 .는 입력값을 끝낸다는 의미였을 뿐

그래서 다시 수정해서

  if (!s.empty() || result == "no") cout << "no" << endl;
  else cout << "yes" << endl;

stack이 비어있지 않거나 결과가 no라면 no를 출력하고

그렇지 않은 경우 yes를 출력하게 했다.

그렇게 맞았습니다를 얻을 수 있게되었다.

코드

#include <iostream>
#include <string>
#include <stack>

using namespace std;

int main(void){
    
    while(1){
        string str;
        getline(cin, str);

        if (str.empty() || str == ".") break;
        
        stack<char> s;
        string result = "yes";
        
        for (int i = 0; i < str.length(); ++i){
            if (str[i] == '(') s.push(str[i]);
            
            else if (str[i] == '[') s.push(str[i]);
            
            else if (str[i] == ')'){
                if (!s.empty() && s.top() == '(') s.pop();
                else{
                    result = "no";
                    break;
                }
            }
            
            else if (str[i] == ']'){
                if (!s.empty() && s.top() == '[') s.pop();
                else{
                    result = "no";
                    break;
                }
            }
        }
        if (!s.empty() || result == "no") cout << "no" << endl;
        else cout << "yes" << endl;
    }
}

0개의 댓글