[BAEKJOON] 백준 16503: 괄호 없는 사칙연산 (C#)

2024. 8. 19. 13:31IT/BaekJoon

문제 링크

https://www.acmicpc.net/problem/16503

 

 

문제

사칙연산에서 곱셈과 나눗셈은 덧셈과 뺄셈보다 먼저 계산한다. 덧셈과 뺄셈을 먼저 계산하고 싶을 때는 보통 가장 큰 연산 우선순위를 가지는 괄호를 사용하여 연산 순서를 지정한다. 예를 들어, 아래의 식은 연산 순서에 따라 두 가지 다른 결과가 나올 수 있다.

  • (2 + 3) × 4 = 20
  • 2 + (3 × 4) = 14

연산 우선순위가 같은 곱셈과 나눗셈 또는 덧셈과 뺄셈만 있는 식에서는 보통 왼쪽에서 오른쪽 순서로 연산을 한다. 하지만 이런 상황에도 연산 순서에 따라 아래와 같이 두 가지 다른 결과가 나올 수 있다.

  • (6 ÷ 2) × 3 = 9
  • 6 ÷ (2 × 3) = 1

만약 곱셈, 나눗셈, 덧셈, 뺄셈의 4가지 연산자의 연산 우선순위가 동등하다고 할 때, 괄호 없는 식에서 서로 다른 연산 순서의 계산 결과를 구하여라.

 

 

입력

첫 번째 줄에는 "K1 O1 K2 O2 K3" 형태로 식이 주어진다. 정수 Ki (1 ≤ Ki ≤ 1,000)는 피연산자를, 문자열 Oi는 곱셈(*), 나눗셈(/), 덧셈(+), 뺄셈(-) 중 한 가지 연산자를 의미한다.

나눗셈 연산은 정수 나눗셈으로 몫만 취하며, 피연산자 중 하나가 음수이면 양수로 바꿔 계산한 결괏값에 음수를 취한다. 또한, 계산 과정에서 0으로 나누어야 하는 식은 주어지지 않는다.

 

 

출력

주어진 식에서 서로 다른 연산 순서의 계산 결과가 작은 것을 첫 번째 줄에, 큰 것을 두 번째 줄에 출력한다.

 

 

 

통과한 답안

namespace _16503
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string[] inputs = Console.ReadLine().Split(' ');
            int n1 = int.Parse(inputs[0]);
            int n2 = int.Parse(inputs[2]);
            int n3 = int.Parse(inputs[4]);
            string c1 = inputs[1];
            string c2 = inputs[3];

            int answer1 = Calcul(n1, n2, c1);
            answer1 = Calcul(answer1, n3, c2);
            int answer2 = Calcul(n2, n3, c2);
            answer2 = Calcul(n1, answer2, c1);

            Console.WriteLine(Math.Min(answer1, answer2));
            Console.WriteLine(Math.Max(answer1, answer2));
        }

        static int Calcul(int n1, int n2, string c1)
        {
            if (c1 == "+")
            {
                return n1 + n2;
            }
            else if (c1 == "-")
            {
                return n1 - n2;
            }
            else if (c1 == "*")
            {
                return n1 * n2;
            }
            else
            {
                return n1 / n2;
            }
        }
    }
}

 

주어진 3개의 숫자와 2개의 연산자에 대해서

왼쪽의 연산을 먼저한 경우와 오른쪽의 연산을 먼저한 경우로 나눠서

작은값과 큰값을 출력하는 문제이다.

 

문제를 해결하기 위해서 각 연산자에 따라서 연산을 수행하는 메서드를 만든 후에

answer1은 왼쪽을 먼저 계산한 결과를

asnwer2는 오른쪽을 먼저 계산한 결과를 저장하도록 한 후에

작은값과 큰값을 출력하도록 구현하였다.