반응형
풀이
후위 표기법으로 계산하는 문제이다.
제시받은 문자열안의 문자들을 순서대로 확인하여 연산자인지 피연산자인지 확인한다. 만약 피연산자인 경우 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 |
댓글