https://www.acmicpc.net/problem/1541
<요약>
괄호가 없는 식이 주어졌을 때 괄호를 적절히 사용하여 최소값을 만드는 것
ex. 55-50+40 -> 55-(50+40) = -35
우선 나는 처음에 알고리즘을 어떻게 구현해야 할지부터 막막했다. 하지만 정답률이 50%가 넘어서 더 멘붕 ㅠ.ㅠ
방법은 의외로 간단했다. '-'마이너스 기호가 한 번이라도 나오면 뒤에 '+'기호가 나왔을 때 다 '-'로 계산해버리면 된다.
내가 막혔던 부분은
처음의 값을 어떻게 저장하지?
-> false로 초기화 한 bool형의 isMinus변수를 사용하여 연산 기호가 나온다면 isMinus를 true로 변경하고, 연산 기호가 나오기 전의 숫자(string형)는 연산 기호가 +든지 -든지 최종 결과에 stoi하여 더해준다.
그렇다면 마지막 숫자는 어떻게 하지?
-> 나는 처음에 for문을 (int i=0;i<str.size();i++)이라고 선언했었는데, 이렇게 되면 숫자인 문자로만 처리를 하고 끝나버린다.
그래서 for문의 범위를 늘려줘서 i가 str.size()와 같아지면 isMinus의 상태에 따라 더하든가 빼든가 해준다.
#include <iostream>
#include <string>
using namespace std;
int main() {
cin.tie(NULL);
cout.tie(NULL);
ios::sync_with_stdio(false);
string str;
cin >> str;
string buffer; // stoi하기 전의 string형 숫자를 저장
bool isMinus=false; // 마이너스 연산기호가 나왔는지 확인용
int result = 0; // 최종 결과 출력용
for (int i = 0; i <= str.size(); i++) { //마지막은 숫자로 끝난다는 조건이 있기 때문에-
//-연산에 포함시키기 위해서 i<=str.size()라고 범위를 설정했다.
if ('0' <= str[i] && str[i] <= '9') {
buffer += str[i]; // 숫자라면 하나씩 추가 -> 한꺼번에 stoi 사용
}
else if (str[i] == '-' || str[i] == '+'|| i == str.size()) {
if (isMinus) { // 마이너스가 한 번이라도 나왔다면
result -= stoi(buffer);
buffer = "";
}
else {
result += stoi(buffer);
buffer = "";
}
}
if (str[i] == '-') isMinus = true;
}
cout << result;
return 0;
}