반응형
풀이
후위 표기법으로 계산하는 문제이다.
제시받은 문자열안의 문자들을 순서대로 확인하여 연산자인지 피연산자인지 확인한다. 만약 피연산자인 경우 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# - 1309 +) 풀이 (2) | 2025.07.11 |
---|---|
백준 C# - 1918 +) 풀이 (1) | 2025.07.04 |
백준 C# - 1107 +) 풀이 (0) | 2025.06.11 |
백준 C# - 2225 +) 풀이 (0) | 2025.04.16 |
백준 C# - 1699 +) 풀이 (0) | 2025.04.16 |
댓글