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

백준 C# - 1918 +) 풀이

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

이 문제를 풀기전에 아래 문제를 먼저 푸는 것을 추천한다.

백준 C# - 1935

 

백준 C# - 1935 +) 풀이

풀이 후위 표기법으로 계산하는 문제이다. 제시받은 문자열안의 문자들을 순서대로 확인하여 연산자인지 피연산자인지 확인한다. 만약 피연산자인 경우 stack에 push하고 연산자인 경우 두번의 Po

code-piggy.tistory.com


중위 표기법에서 후위 표기법으로 바꾸는 문제이다.

중위 표기법에서 후위표기법으로 바꿀때 연선자 우선순위를 고려해야 한다.

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());
        }
    }
}

질문게시판에 들어가보니 감사하게도 반례를 공유해주신분이 있었다.

반례 모음

 

글 읽기 - 반례 공유합니다

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 

 

 

 

 

 

반응형

'코딩테스트 준비 > 백준 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

댓글