문제
세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.
그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.
괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.
입력
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.
출력
첫째 줄에 정답을 출력한다.
예제 입력 1
55-50+40
예제 출력 1
-35
예제 입력 2
10+20+30+40
예제 출력 2
100
예제 입력 3
00009-00009
예제 출력 3
0
<code>
#include<iostream>
#include<string>
using namespace std;
int main(){
string num; //정답입력
string temp;
int sum=0;
bool minus = false; // '-'부호 판별
cin >> num;
for(int i=0; i<=num.size();i++){
if(num[i] == '+' || num[i] == '-' || i == num.size()){ //각 기호들을 만나면 +연산 / '-'가 true상태에선 이후 모두 -연산
if(minus == true){
sum -= stoi(temp);
temp = "";
}else{
if(num[i] == '-') minus = true;
sum += stoi(temp); //연산기호가 아닐경우는 temp에 해당하는 숫자를 입력
temp="";
}
}
else temp += num[i];
}
cout << sum;
return 0;
}
가장먼저 string타입의 입력을 받은 후 적절한 위치에 괄호를 넣어(연산의 우선순위를 변경하여) 식을 가장 작은 값으로 만들어 내야하는 문제였다. 처음 이문제를 읽은 후 이해를 하는 과정까지 꽤 많은 시간이 걸려 오답도 많이 만들어냈다. 가장 먼저 마주했던 오답은 " - " 기호를 만나면 수를 빼주도록 작성했는데 그 이후에 + 연산을 만나면 -가 아니라 +를 해주는 방식이 되었기 때문에 -기호를 만난 후면 어떤기호를 만나던 모두 - 연산을 해 줄 수 있도록 bool타입의 minus를 선언했고 "-"기호를 만난 이후의 연산이 모두 -가 적용될 수 있도록 minus = true 작업을 처리 해 주었다.
#연산을 진행하기 위해 #include<string>에 포함된 stoi함수를 이용하여 처음 입력 받았던 string형식의 입력을 int형식으로 바꾸어 주었다.
'Algorithm > baekjoon' 카테고리의 다른 글
(C++) baekjoon 1789 수들의 합 (1) | 2022.12.19 |
---|---|
(C++) baekjoon 10773 제로 (0) | 2022.11.28 |
(C++) baekjoon 1931 회의실 (0) | 2022.10.17 |
(C++) baekjoon 10162 전제레인지 (1) | 2022.09.29 |
(C++) baekjoon 2217 로프 (2) | 2022.09.26 |