[백준/BOJ] 백준 1541번 : 잃어버린 괄호

2020. 6. 15. 03:39알고리즘 문제풀이

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

 

1541번: 잃어버린 괄호

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

www.acmicpc.net

-를 만나면 해당 -뒤에 괄호를 열고( ( ), 다음 -가 나오는 위치 뒤에 괄호를 닫는다( ) ).

다음 -가 나오지 않는다면 수식의 끝 부분에 괄호를 닫는다.

 

코드

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	string input;
	vector<int> num;
	string s_temp;
	int cnt = 0;//num벡터에 있는 숫자들의 몇번째를 다룰지 표시하는 변수
	int sum = 0;
	int tempsum = 0;

	//수식을 입력받는다.
	cin >> input;

	//+,-를 제외한 숫자들을 입력 순서대로 벡터 num에 넣는다
	for (int i = 0; i < input.size(); i++)
	{
		if (input[i] != '+' && input[i] != '-')
		{
			s_temp += input[i];
		}

		else
		{
			num.push_back(stoi(s_temp));
			s_temp.clear();
		}

		//수식의 마지막 숫자도 넣는다.
		if (i == input.size() - 1)
		{
			num.push_back(stoi(s_temp));
			s_temp.clear();
		}

	}

	//현재 cnt는 0이므로 첫번째 숫자는 무조건 합에 들어가니 더한다
	sum += num[cnt];
	cnt++;

	for (int i = 0; i < input.size(); )
	{
		//+가 나오면 +뒤의 숫자를 sum에 합한다
		if (input[i] == '+')
		{
			sum += num[cnt];
			cnt++;
			i++;
		}

		//-가 나오면 -뒷 숫자 부터 다음 - 가 나오기 전 숫자들을 모두 tempsum에 더한다
		//수식의 끝까지 다음 -가 나오지 않는다면 수식의 끝까지 숫자들을 모두 tempsum에 더한다
		//이것은 -뒤 부터 다음 -가 나오기 전 까지 또는 다음 -가 나오지 않는다면 수식의 끝 부분까지의 수식들을 괄호 친것을 의미한다
		// 예) a-(b+c+d)-e 또는 a-(b+c+d)
		//tempsum은 마지막에 뺼 합들이다
		else if (input[i] == '-')
		{
			tempsum += num[cnt];
			cnt++;

			for (int j = i + 1; i < input.size(); j++)
			{
				//-가 나오면 -이전 부분에 괄호를 닫은것 이다
				//i는 j위치부터 다시 시작한다
				if (input[j] == '-')
				{
					i = j;
					break;
				}

				//괄호를 닫지 않고 tempsum에 더해간다
				else if (input[j] == '+')
				{
					tempsum += num[cnt];
					cnt++;
				}

				//수식의 끝에 도달했다면 괄호를 닫을 수 밖에 없다
				if (j == input.size() - 1)
				{
					i = j;
					break;
				}
			}
		}

		else
			i++;
	}
	//괄호친 부분을 뺸다
	cout << sum - tempsum;

	
	return 0;
}