본문으로 바로가기
잃어버린 괄호 문제

www.acmicpc.net/problem/1541

 

1541번: 잃어버린 괄호

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

www.acmicpc.net

소스코드
#include <bits/stdc++.h>
using namespace std;

int main(){
   ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
   string s,tmp="";
   int result = 0;
   
   bool check = false;
   cin >> s;
   int size = s.size();
   for (int i = 0; i <= size; i++) {
	   if (s[i] == '-'||s[i]=='+'||s[i]=='\0') {
		   if (check)
			   result -= stoi(tmp);
		   else
			   result += stoi(tmp);
		   tmp = "";
		   if (s[i] == '-')check = true;
		   continue;

	   }
	   tmp += s[i];
   }
   cout << result;
}
해결방법

문자열을 어떻게 처리할 수 있는가..

어떻게 문제를 풀어나가는가 하면 +기호가 나오면 그냥 계속 더해줍니다. 그러다가 -마이너스 기호를 만나게 되면 그 뒤로 어떤 연산자가 나오던간에 그냥 계속 빼주면 그게 가장 작은 숫자가 됩니다.

 

55-50+40

프로그램 로직상은 55를 만나서 result에 저장해줍니다. 그러다 -마이너스를 만나 55-50-40을 해줍니다.

이게 무슨의미냐하면 55-(50+40)이렇게 괄호를 쳣다고 가정하면, 분배법칙에 의해 55-50-40으로 바뀔 수 있습니다.

괄호 앞에 마이너스가 붙게되면 그 이후의 숫자들은 그냥 계속 뺀다고 생각하면 쉽게 해결할 수 있습니다.