본문 바로가기
알고리즘/백준 BOJ

[ BOJ/C# ] 4949 균형잡힌 세상

by 왹져박사 2023. 10. 29.

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

 

4949번: 균형잡힌 세상

각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"), 대괄호("[ ]")로 이루어져 있으며, 온점(".")으로 끝나고, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마지막에

www.acmicpc.net

Stack을 이용하여 푸는 문제이다. 전에 비슷한 문제를 풀었던 것 같다. 

처음에 틀린 이유는, stack에 괄호가 남아있는 경우의 수를 계산하지 못했기 때문이다. 

using System;
using System.IO;
using System.Text;

namespace B4949
{
    class Program
    {
        static void Main()
        {
            StreamReader sr = new StreamReader(Console.OpenStandardInput());
            StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
            StringBuilder sb = new StringBuilder();

            Stack<char> stack = new Stack<char>();
            while (true)
            {
                //입력
                string input = sr.ReadLine();
                //종료 조건
                if (input[0] == '.') break;

                bool isOK = true;   //균형잡혔나
                //input의 char 검사
                for(int i = 0; i < input.Length; i++)
                {
                    if (input[i] == '(' || input[i] == '[')
                    {
                        //여는 괄호면 스택에 넣음
                        stack.Push(input[i]);   
                        isOK = false;
                    }
                    else if (input[i] == ')' || input[i] == ']')
                    {
                        //닫는 괄호면 검사
                        if(stack.Count == 0)
                        {
                            //스택에 저장된 괄호가 없다면 종료
                            isOK = false;
                            break;
                        }
                        var c = stack.Pop();
                        if (input[i] == ')')    //닫는 소괄호
                        {
                            if(c != '(')
                            {
                                isOK = false;
                                break;
                            }
                            else isOK = true;
                        }
                        else if (input[i] == ']')   //닫는 대괄호
                        {
                            if(c != '[')
                            {
                                isOK = false;
                                break;
                            }
                            else isOK = true;
                        }
                    }
                }
                //스택에 괄호가 남아있다면 균형 실패
                if (stack.Count > 0) isOK = false;
                stack.Clear();  //스택 초기화
                //결과
                if (!isOK) 
                {
                    sb.Append("no\n");
                    continue;
                }
                else sb.Append("yes\n");
            }
            sw.Write(sb);
            sr.Close();
            sw.Flush();
            sw.Close();
        }
    }
}

'알고리즘 > 백준 BOJ' 카테고리의 다른 글

[ BOJ/C# ] 2193 이친수  (0) 2023.10.31
[ BOJ/C# ] 1316 그룹 단어 체커  (1) 2023.10.30
[ BOJ/C# ] 11050 이항 계수 1  (1) 2023.10.28
[ BOJ/C# ] 2108 통계학  (0) 2023.10.27
[ BOJ/C# ] 18110 solved.ac  (0) 2023.10.25