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;

}


+ Recent posts