C#/알고리즘

백준#1541 - 잃어버린 괄호

McRobbin 2020. 4. 11. 17:36

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

 

1541번: 잃어버린 괄호

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다.

www.acmicpc.net

그리디 알고리즘으로 분류된 잃어버린 괄호 문제 입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _1541
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = Console.ReadLine();
            string[] plusInput = input.Split('-');
            int start = 0;
            foreach (string strNum in plusInput[0].Split('+'))
                start += int.Parse(strNum);
 
            //-가 한개도 안나온 경우.
            if (plusInput.Length == 0)
                Console.WriteLine(start);
 
            //-가 한번이라도 나온 경우.
            else
            {
                for(int i = 1; i < plusInput.Length; i++)
                {
                    string[] plusSplitInput = plusInput[i].Split('+');
                    foreach (string strNum in plusSplitInput)
                        start -= int.Parse(strNum);
                }
                Console.WriteLine(start);
 
            }
        }
    }
}
 
 
 

이 문제의 핵심은 -의 등장 유무 입니다. -가 몇개 있는지도 중요하지 않습니다.

ex) 19 + 14 - 15 + 4 - 15 + 13 + 2 + 2

이렇게 있을 경우 처음 19에서 14를 뺄 수 있는 방법은 전혀 없습니다. 하지만 계산중에

+4를 뺄 수 있는 방법은 있습니다.

바로 앞의 -15를 이용해 이와 괄호로 묶어 -(15 + 4)와 같은 방식으로 쓸 수 있습니다.

즉 -가 등장한 시점부터 뒤의 모든 수는 전부 뺄 수 있습니다. 중간에 -가 섞여 있다면

그 바로 앞에서 괄호를 닫고 다시 여는 것으로 다시 빼기를 시작할 수 있습니다.

 

우선 입력받은 식의 -를 기준으로 split했습니다. 0번째 식의 결과는 빼기를 시작할 처음 수가 됩니다.

다음 부터는 숫자를 전부 빼주면 되는데 저는 split('-') 되어 있는 식에 다시 모두 + 스플릿을 하여 가져왔습니다.

그 다음 처음 식의 결과값 부터 모두 빼주고 출력하면 되겠습니다.