위의 문제는 단순히 괄호를 추가하여 가장 작은 값을 만들면 됩니다.
예제 입력 1
55 - 50 + 40 에서 가장 작은값을 만드는 괄호는
55 - (50 + 40) = -35입니다. => 정답이 -35 로 출력되어 맞죠.
첫 입력부와 마지막 입력부는 숫자입니다.
첫입력부 숫자 앞에는 - 부호가 붙지 않으니 무조건 양수입니다.
ex ) A + B - C + D - E - F + G + H - I
A + B - [C + D] - [E] - [F + G + H] - [I]
처음 - 부호가 나오고 이후의 숫자들은 +이던 -이던 괄호 처리로 무조건 뺄 수 있습니다.
- 부호 이후부터 나오는 모든 값들을 빼주면, 최대한으로 빼주게 됩니다.
+와 - 그리고 ()까지 있어서 charater별 check하기위해 string사용하였습니다.
InputData에서 string으로 식 받아옵니다.
<C++>
#include <iostream>
#include <string>
using namespace std;
//입력받는부분
string input;
void InputData(){
cin >> input;
}
int main(){
InputData();
int ans = 0;
// 숫자 받아올 버퍼입니다.
string temp;
//처음 마이너스 부호 구분 flag입니다.
bool FirstMinusFlag = false;
for(int i = 0; i<= input.size(); i++)
{
if( input[i] == '-' || input[i] == '+' || input[i] == '\0')
{
if(FirstMinusFlag == true)
{
//stoi로 string to int 형변형입니다.
ans -= stoi(temp);
}
else
{
ans += stoi(temp);
}
// ans에 temp값 처리된 후 다음 숫자를 받아오기 위해 clear합니다.
temp.clear();
if(input[i] == '-')
{
//처음 minus 부호 시에만 타는 if문입니다.
FirstMinusFlag = true;
}
continue;
}
//char 한숫자씩 string에 담습니다. stoi로 위에서 형변형을 함으로 10진수 처리 안해줘도 됩니다.
temp += input[i];
//Debugging Code
// cout<<"i :"<<i<<"temp :"<<temp<<endl;
//cout<<"i :"<<i<< "ans: "<<ans<<endl;
}
cout<<ans<<endl;
return 0;
}
<Python>
s = str(input())
#int 형
sum = 0
FirstMinusFlag = False
temp = ""
for i in s:
# Python string은 할당된 string이상의 index에 접근하지 못하도록 되어있음
# overflow를 강제로 발생시킬수 없음.
if(i == '-' or i == '+'):
if(FirstMinusFlag == True):
sum -= int(temp)
else :
sum += (int(temp))
temp = ''
if(i == '-') :
FirstMinusFlag = True
#부호일때 temp에 부호가 추가되지 않도록 continue
continue
temp += str(i)
#마지막 숫자를 추가해줌
if(FirstMinusFlag == True):
sum -= int(temp)
else :
sum += (int(temp))
print(sum)
'백준 문제풀이 > 그리디 알고리즘' 카테고리의 다른 글
Greedy Algorithm - [백준 문제 : 10162] 전자레인지 풀이 (0) | 2020.11.18 |
---|---|
Greedy Algorithm - [백준 문제 : 11399] ATM 풀이 (0) | 2020.11.13 |