https://www.acmicpc.net/problem/1541
세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다. 그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다. 괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.
첫째 줄에 식이 주어지는데, 그 조건은 다음과 같다.
첫째 줄에 정답을 출력한다.
'-' 문자가 나온 지점을 체크하여 부분 문자열을 추출하는 방법이 까다롭고,
추출했다고 해도 그걸 어떻게 수식으로 인식하여 덧셈을 할 것인지 고민...
'-' 문자가 한번이라도 나오면, (괄호를 풀어서) 그 뒤의 숫자들을 모두 뺄셈으로 계산하자!
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
string tmp = ""; // 숫자 하나를 임시 저장하는 변수
int ans = 0;
bool minus = false;
// [] 연산자는 배열 인덱스 범위 넘어도 예외 발생x
for(int i = 0; i <= s.length(); i++){
if(s[i] == '+' || s[i] == '-' || s[i] == '\0'){
if(minus){
ans -= stoi(tmp); // 50 40
}else{
ans += stoi(tmp); // 55
}
tmp = ""; // 임시 변수 초기화
// - 문자가 한번이라도 나오면 그 뒤의 숫자들은 모두 뺄셈 연산
if(s[i] == '-'){
minus = true;
}
}
else{ // tmp 문자열에 숫자 한자리씩 붙이기
tmp += s[i];
}
}
cout << ans << "\n";
return 0;
}
https://neodreamer-dev.tistory.com/256
at() 연산자는 배열 인덱스 범위를 넘어가면 std::out_of_range 예외를 발생시키지만, [] 연산자는 범위 체크를 하지 않기 때문에 경고만 발생한다.
https://hashcode.co.kr/questions/5777
char형 배열과의 호환성을 위해 string의 끝에도 널문자가 있긴 하다. 다만, string 객체는 size()나 length() 함수로 길이를 알 수 있기 때문에 문자열의 끝을 체크할 때 널문자를 사용하지 않아도 된다. 따라서 앞의 코드에서도 s[i] == '\0'
대신 i == s.length()
이렇게 작성해도 된다.