동식이 취업시키기 작전/코딩테스트

[백준] 4949 균형잡힌 세상(C#)

이동식이 2024. 1. 24. 02:01
728x90

문제

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

 

4949번: 균형잡힌 세상

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

www.acmicpc.net

이전에 진행했던 대칭괄호 문제와 유사하다. Stack의 Peek을 사용해도 되고 Queue를 사용해도 될 거 같다.

코드

using System;
using System.Text;
using System.Collections.Generic;

namespace baekjoon
{
    class Algorithm
    {
        static void Main(string[] str)
        {
            while(true)
            {
                string s = Console.ReadLine();
                
                if(s.Length == 1 && s[0] == '.') { break; }
                
                bool isOkay = true;
                Stack<char> stack = new Stack<char>();
                
                foreach(var c in s)
                {
                    if(c == '(' || c == '[') { stack.Push(c); }
                    
                    if(c == ')')
                    {
                        if(stack.Count == 0 || stack.Peek() != '(')
                        {
                            isOkay = false;
                            break;
                        }
                        else
                        {
                            stack.Pop();
                        }
                    }
                    if(c == ']')
                    {
                        if(stack.Count == 0 || stack.Peek() != '[')
                        {
                            isOkay = false;
                            break;
                        }
                        else
                        {
                            stack.Pop();
                        }
                    }
                }

                if(stack.Count == 0 && isOkay == true)
                {
                    Console.WriteLine("yes");
                }
                else
                {
                    Console.WriteLine("no");
                }
            }
            
        }
    }
}

고민

내가 이거때문에 이해가 안되서 잠을 못잤다. 

 

결국 다른 사람 코드를 대조하면서까지 집요하게 찾아냈는데.. 이유가

using System;
using System.Text;
using System.Collections.Generic;

namespace baekjoon
{
    class Algorithm
    {
        static void Main(string[] str)
        {
            Stack<char> stack = new Stack<char>();
            StringBuilder sb = new StringBuilder();
            
            while(true)
            {
                string s = Console.ReadLine();
                
                // 종료 조건
                if(s.Length == 1 && s[0] == '.') { break; }
                
                // 반복 조건
                for(int i = 0; i < s.Length; i++)
                {
                    if(s[i] == '(' || s[i] == '[')
                    {
                        stack.Push(s[i]);
                    }
                    if(s[i] == ')')
                    {
                        if(stack.Peek() != '(' || stack.Count == 0)
                        {
                            sb.AppendLine("no");
                            stack.Clear();
                            continue;
                        }
                        else
                        {
                            stack.Pop();
                        }
                    }
                    if(s[i] == ']')
                    {
                        if(stack.Pop() != ']' || stack.Count == 0)
                        {
                            sb.AppendLine("no");
                            continue;
                        }
                        else
                        {
                            stack.Pop();
                        }
                    }
                    
                    if(stack.Count == 0)
                    {
                        sb.AppendLine("yes");
                        break;
                    }
                }
            }
            Console.WriteLine(sb);
        }
    }
}

다른 분들은 보이시나요...

 

if문에서 stack.Count == 0을 먼저 해주지 않아서 그렇다.... Stack은 후입선출을 하는 자료구조이기 때문에 stack안에 데이터가 없으면 에러가 발생하는데, 이를 if문에서 미리 stack.Count == 0로 예외처리를 해주고 다음 || 이하의 연산(?)에 들어가야해서 그렇다.

 

내가 진짜.. 이거때문에 얼마나 힘들고 다른 사람 코드를 봐야한다는 사실에 기분도 안좋고 슬펐는데 결국 내 무지와 섬세하지 못한 부분에서 또 일이 났다.

 

앞으로는 이런 부분에서 문제가 발생하지 않도록 주의 해야겠다고 생각했다.