https://www.acmicpc.net/problem/1541
해당 문제는 주어직 식을 가지고 적절한 곳에 괄호를 쳐서 최솟값을 만드는 문제이다.
이 문제를 해결하려면 경우의 수를 생각하면 된다.
+, -만 사용 가능하므로
1. + +
2. - -
3. + -
4. - +
가 나온 경우가 있다.
1~3번은 그냥 더하도록 하고, 4번의 경우만 처리해주면 된다.
-가 나오고 +가 나오면 더해주고 +가 안나올때 (-1)을 곱해서 값을 저장해둔다.
#include<iostream>
using namespace std;
#include<string>
string a,cmp;
int arr[100],ans;
bool chk = true;// false-> - / true -> +
int idx = 0;
int main()
{
cin >> a;
cmp = "";
chk = true;
//기본 chk는 +설정
for (int i = 0; i < a.size(); i++)
{
if (a[i] == '+')
{
if (!cmp.empty() && chk)
{
arr[idx++] = atoi(cmp.c_str());
cmp = "";
}
else if (!cmp.empty() && !chk)
{
arr[idx++] = (-1)*atoi(cmp.c_str());
cmp = "";
}
chk = true;
}
else if (a[i] == '-')
{
if (!cmp.empty() &&chk)
{
arr[idx++] = atoi(cmp.c_str());
cmp = "";
}
else if(!cmp.empty() && !chk)
{
arr[idx++] = (-1)*atoi(cmp.c_str());
cmp = "";
}
chk = false;
}
else
{
cmp += a[i];
}
}
if (!cmp.empty() && chk)
{
arr[idx++] = atoi(cmp.c_str());
cmp = "";
}
else if (!cmp.empty() && !chk)
{
arr[idx++] = (-1)*atoi(cmp.c_str());
cmp = "";
}
int minus = 0,sum=0;
chk = false;
for (int i = 0; i < idx; i++)
{
if (arr[i] < 0 && arr[i + 1]>=0) //-이후에 +나오면
{
minus += arr[i];
int j = i+1;
sum = 0;
while(arr[j]>0)
{
sum += arr[j];
j++;
}
i = j-1;
minus += (sum)*(-1);
}
else {
ans += arr[i];
}
}
ans =ans+minus;
cout << ans << "\n";
return 0;
}
'백준_문제풀이' 카테고리의 다른 글
[백준]: 2352번: 반도체 설계 / lower_bound & LIS (0) | 2018.10.07 |
---|---|
[백준]: 2875번: 대회 or 인턴 / 탐욕적 기법(Greedy Algorithm) (0) | 2018.10.04 |
[백준]: 10610번: 30 / 탐욕적 기법(Greedy Algorithm) (0) | 2018.10.04 |
[백준]: 5557번: 1학년 / DP(동적프로그래밍) (0) | 2018.09.27 |
[백준]: 2841번: 외계인의 기타연주 / Stack & pair (0) | 2018.09.26 |