본문 바로가기
c#/알고리즘

2504번 괄호의 값 - 런타임 에러 - 해결

by Luna_O 2020. 6. 18.

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

 

2504번: 괄호의 값

4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다.  만일

www.acmicpc.net

 

 

stack을 이용해서 풀어야한다

밑에 그림 참고해서 괄호를 하나씩 확인해서 stack에 넣고 확인하고 쌓고 빼고 숫자 넣고 더하고 빼고 반복해야한다

그러고 남아있는게 없으면 올바른 괄호이고 계산을 하면된다

계산은 괄호 다 풀고 마지막에 남은거 더해서 출력하면 됨

값은 다 잘나오는데 런타임 에러 뜬다ㅠㅠㅠㅠ뭐가 문제인지...?

 

)), ]] 입력받으면 스택이 비어있는데 peek로 확인을 해서 에러가 남

그래서 ), ] 받으면 0 출력하고 리턴시키는거 코드 추가해서 정답!

using System;
using System.Collections.Generic;

namespace _2504
{
    class Program
    {
        static void Main(string[] args)
        {
            var input = Console.ReadLine();
            var stack = new Stack<string>();

            foreach (var strput in input)
            {
                string put = strput.ToString();
                switch (put)
                {
                    case "(":
                    case "[":
                        stack.Push(put);
                        break;

                    case ")":
                        if (stack.Count != 0 && stack.Peek() == "(") { stack.Pop(); }
                        else
                        {
                            Console.WriteLine(0);
                            return;
                        }
                        break;
                    case "]":
                        if (stack.Count != 0 && stack.Peek() == "[") { stack.Pop(); }
                        else
                        {
                            Console.WriteLine(0);
                            return;
                        }
                        break;
                }
            }

            if (stack.Count == 0)
            {
                foreach (var strput in input)
                {
                    string put = strput.ToString();
                    int sum = 0;
                    switch (put)
                    {
                        case "(":
                        case "[":
                            stack.Push(put);
                            break;

                        case ")":
                            while (stack.Peek() != "(")
                            {
                                sum += int.Parse(stack.Pop());
                            }
                            stack.Pop();
                            if (sum == 0)
                            {
                                stack.Push("2");
                            }
                            else
                            {
                                stack.Push((sum * 2).ToString());

                            }
                            break;

                        case "]":
                            while (stack.Peek() != "[")
                            {
                                sum += int.Parse(stack.Pop());
                            }
                            stack.Pop();
                            if (sum == 0)
                            {
                                stack.Push("3");
                            }
                            else
                            {
                                stack.Push((sum * 3).ToString());
                            }
                            break;
                    }
                }
                int result = 0;
                while (stack.Count != 0)
                {
                    result += int.Parse(stack.Pop());
                }
                Console.WriteLine(result);
            }
            else
            {
                Console.WriteLine(0);
            }
        }
    }
}

'c# > 알고리즘' 카테고리의 다른 글

정리  (0) 2020.07.08
1074번 z  (0) 2020.06.29
1302번 베스트셀러  (0) 2020.06.08
1343번 폴리오미노  (0) 2020.06.01
1181 단어 정렬  (0) 2020.05.25