while(1) 작심삼일();

[백준 1541번] 잃어버린 괄호 본문

CS/baekjoon

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

hanjongho 2021. 4. 19. 19:35

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

 

1541번: 잃어버린 괄호

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

www.acmicpc.net

풀이) 

1. 문자열을 숫자들로 분해하였다. ex) 55-50+40 -> 55, -50, 40

2. -로 시작한다면 vector범위내에서 +가 나오면 -혹은 범위가 안될 때 까지 계속 sum에 누적시킨다(첫번째 음수는 양수로 변환시킴)

3. sum에 -1을 곱해서 음수로 만든다.

4. ans에 더한다.

 

(* 문자열문제를 풀어본 경험이 없어서 string도 찾아보느라 오래걸렸고 코드가 너무 지저분하다 😭)

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

int ans = 0, i = 0;
vector<int> num;

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	
	string str;
	cin >> str;
	str.insert(0, "+");
	while (str[i])
	{
		if (str[i] == '-' || str[i] == '+')
		{
			char t = str[i];
			i++;
			string tmp;
			while ('0' <= str[i] && str[i] <= '9')
			{
				string t;
				t = str[i];
				tmp.append(t);
				i++;
			}
			int n = stoi(tmp);
			if (t == '-')
				n *= -1;
			num.push_back(n);
		}
	}
	
	for (int i = 0 ; i < num.size(); i++)
	{
		if (num[i] < 0 && i + 1 < num.size() && num[i + 1] > 0)
		{
			int sum = num[i] * -1;
			i++;
			while (num[i] > 0 && i < num.size())
			{
				sum += num[i];
				i++;
			}
			ans += (sum * - 1);
			i--;
		}
		else
			ans += num[i];
	}
	
	cout << ans << "\n";
	return (0);
}

 

 

제 코드는 절대 완벽하지 않습니다

더 좋은 풀이방법 혹은 코드에 관한 질문이 있으시면 언제든 댓글주세요!

'CS > baekjoon' 카테고리의 다른 글

[백준 1966번] 프린터 큐  (0) 2021.04.19
[백준 2559번] 수열  (0) 2021.04.19
[백준 1874번] 스택 수열  (0) 2021.04.19
[백준 2470번] 두 용액  (0) 2021.04.19
[백준 7569번] 토마토  (0) 2021.04.17
Comments