반응형
이 문제를 풀기전에 아래 문제를 먼저 푸는 것을 추천한다.
백준 C# - 1935
중위 표기법에서 후위 표기법으로 바꾸는 문제이다.
중위 표기법에서 후위표기법으로 바꿀때 연선자 우선순위를 고려해야 한다.
01 우선순위 메서드
static int Precedence(char c)
{
switch (c)
{
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}
02 입력받은 string을 검사
foreach (char c in line)
03 문자가 피연산자이면 answer에 추가
if (char.IsLetterOrDigit(c))
{
answer.Append(c);
}
04 '('문자
스택에 Push
else if (c == '(')
{
stack.Push(c);
}
05 ')' 문자
스택에서 '('괄호가 나올때까지 연산자를 Pop하고 answer에 추가한다.
else if (c == ')')
{
while (stack.Count > 0 && stack.Peek() != '(')
{
answer.Append(stack.Pop());
}
stack.Pop(); // ')' Pop용도
}
06 연산자인 경우
스택의 맨 위에 있는 연산자(stack.Peek())의 우선순위가 현재 연산자 c의 우선순위보다 크거나 같은 경우 answer에 추가한다. 이렇게 하는 경우 우선순위 순서대로 연산자가 추가된다.
else
{
while (stack.Count > 0 && Precedence(c) <= Precedence(stack.Peek()))
{
answer.Append(stack.Pop());
}
stack.Push(c);
}
07 마지막으로 스택에 남아있는게 있으면 Pop
while (stack.Count > 0)
{
answer.Append(stack.Pop());
}
예제
A+B*C
코드 전문
using System;
using System.Collections.Generic;
using System.Text;
namespace baek2
{
class Program
{
static int Precedence(char c)
{
switch (c)
{
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}
static void Main(string[] args)
{
string line = Console.ReadLine();
Stack<char> stack = new Stack<char>();
StringBuilder answer = new StringBuilder();
foreach (char c in line)
{
if (char.IsLetterOrDigit(c))
{
answer.Append(c);
}
else if (c == '(')
{
stack.Push(c);
}
else if (c == ')')
{
while (stack.Count > 0 && stack.Peek() != '(')
{
answer.Append(stack.Pop());
}
stack.Pop();
}
else
{
while (stack.Count > 0 && Precedence(c) <= Precedence(stack.Peek()))
{
answer.Append(stack.Pop());
}
stack.Push(c);
}
}
while (stack.Count > 0)
{
answer.Append(stack.Pop());
}
Console.Write(answer.ToString());
}
}
}
질문게시판에 들어가보니 감사하게도 반례를 공유해주신분이 있었다.
반례 모음
반응형
'코딩테스트 준비 > 백준 C#' 카테고리의 다른 글
백준 C# - 10809 (0) | 2023.10.23 |
---|---|
백준 C# - 10808 (0) | 2023.10.23 |
백준 C# - 1935 +) 풀이 (0) | 2023.10.20 |
백준 C# - 17298 +) 풀이 (0) | 2023.10.17 |
백준 C# - 10799 +) 풀이 (0) | 2023.10.15 |
댓글