백준 1541 : 잃어버린 괄호

혀니앤·2022년 2월 15일
0

C++ 알고리즘

목록 보기
93/118

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

1. 접근

  • 최솟값을 구해야 하므로, - 값이 커질수록 좋다.
  • 즉, -가 나오고 그 뒤에 +가 나왔다면 그 사이를 괄호로 묶어주어야 최솟값이 된다.
    ex) 55-50+40 -> 55-(50+40)
    • 가 한번이라도 나온다면 그 뒤의 +들은 모두 -로 바뀔 수 있다.
      => -가 나왔는지를 bool로 체크한 후, 나왔다면 이후에 +는 모두 -로 바꿔준다.
      (-가 여러번 나오면 괄호를 여러번 씌우면 되기때문에 한번 나왔는지만 체크해주면 된다)

2. 반례

case 1
0-100+50-100+50-100
출력 : -400

case 2
0-100+50+50-50
출력 : -250

3. 나의 풀이

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

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

	vector<int> num;
	vector<char> sign;

	string input;
	cin >> input;

	int tem = 0;
	for (int i = 0; i < input.length(); i++) {
		if (isdigit(input[i])) {
			tem = tem * 10 + (input[i] - '0');
		}
		else {
			num.push_back(tem);
			sign.push_back(input[i]);
			tem = 0;
		}
		if (i == input.length() - 1) {
			num.push_back(tem);
		}
	}

	bool IsChangeable = false;
	for (int i = 0; i < sign.size(); i++) {
		if (IsChangeable) {
			if (sign[i] == '+')	sign[i] = '-';
		}
		else if (sign[i] == '-') {
			IsChangeable = true;
		}
	}
	
	int ret = num[0];
	for (int i = 0; i < num.size()-1; i++) {
		if (sign[i] == '+') {
			ret += num[i+1];
		}
		else {
			ret -= num[i + 1];
		}
		//cout << "현재 ret : " << ret << "\n";
	}

	cout << ret << "\n";
	return 0;
}
profile
일단 시작하기

0개의 댓글