본문 바로가기
코딩테스트 준비/백준 C#

백준 C# - 1935 +) 풀이

by 코딩하는 돼징 2023. 10. 20.
반응형

풀이

후위 표기법으로 계산하는 문제이다.

제시받은 문자열안의 문자들을 순서대로 확인하여 연산자인지 피연산자인지 확인한다. 만약 피연산자인 경우 stack에 push하고 연산자인 경우 두번의 Pop을 통해 연산을 수행하도록한다.


예제 문제 풀이

5
ABC*+DE/-
1
2
3
4
5

과정

그림과 같이 흐름만 알게된다면 쉽게 풀 수 있다.


코드

using System;
using System.Collections.Generic;

namespace baek2
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());
            string line = Console.ReadLine();
            int[] array = new int[n];
            for(int i = 0; i<n;i++)
            {
                int x = int.Parse(Console.ReadLine());
                array[i] = x;
            }

            Stack<double> stack = new Stack<double>();

            foreach(char c in line)
            {
                switch(c)
                {
                    case ('+'):
                    {
                        double a = stack.Pop();
                        double b = stack.Pop();
                        stack.Push(b + a);
                        break;
                    }
                    case ('-'):
                    {
                        double a = stack.Pop();
                        double b = stack.Pop();
                        stack.Push(b - a);
                        break;
                    }
                    case ('*'):
                    {
                        double a = stack.Pop();
                        double b = stack.Pop();
                        stack.Push(b * a);
                        break;
                    }
                    case ('/'):
                    {
                        double a = stack.Pop();
                        double b = stack.Pop();
                        stack.Push(b / a);
                        break;
                    }
                    default:
                    {
                        stack.Push(array[c-'A']);
                        break;
                    }

                }
            }
            Console.Write(string.Format("{0:0.00}", stack.Pop()));
        }

    }
}

코드가 반복되는 부분이 많아서 개선해봤다.

개선된 코드

using System;
using System.Collections.Generic;

namespace baek2
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());
            string line = Console.ReadLine();
            int[] array = new int[n];
            for(int i = 0; i<n;i++)
            {
                int x = int.Parse(Console.ReadLine());
                array[i] = x;
            }

            Stack<double> stack = new Stack<double>();

            foreach (char c in line)
            {
                if (char.IsLetter(c))
                {
                    stack.Push(array[c - 'A']);
                }
                else
                {
                    double a = stack.Pop();
                    double b = stack.Pop();
                    switch (c)
                    {
                        case '+':
                            stack.Push(b + a);
                            break;
                        case '-':
                            stack.Push(b - a);
                            break;
                        case '*':
                            stack.Push(b * a);
                            break;
                        case '/':
                            stack.Push(b / a);
                            break;
                    }
                }
            
            }
            Console.Write(string.Format("{0:0.00}", stack.Pop()));
        }

    }
}

 

 

 

반응형

'코딩테스트 준비 > 백준 C#' 카테고리의 다른 글

백준 C# - 10808  (0) 2023.10.23
백준 C# - 1918 +) 풀이  (0) 2023.10.20
백준 C# - 17298 +) 풀이  (0) 2023.10.17
백준 C# - 10799 +) 풀이  (0) 2023.10.15
백준 C# - 17413 +) 풀이  (0) 2023.10.15

댓글