Link https://www.acmicpc.net/problem/1541
소스결과 1988 KB / 0 ms
출처 Baekjoon
언어 C++ 17
분류 그리디 알고리즘
설명
양수, +, -로 구성된 식에 적절한 괄호를 추가해 결과 값을 최소로 만드는 경우의 값을 출력한다.
-가 등장하는 순간 그 뒤에 + 식을 전부 괄호로 묶으면 괄호 안의 결과 값을 빼는 모습이 된다.
즉 -가 등장하기 전 까지의 합과, 등장한 후의 합을 빼면 그 결과 값은 항상 최소값이 된다.
굳이 어려운 점을 따지자면 문자열을 입력받아 연산자와 피연산자를 나누는게 어려운부분..?
알고리즘
1. 문자열을 입력받는다.
2. 문자열의 0번 인덱스부터 문자열의 길이만큼 반복한다.
2 - 1. 현재 위치의 문자 값이 숫자인 경우 연산자를 만나기 전 까지 숫자로 바꾸며, 10진법에 맞는 형태의 계산 결과를 띈다.
2 - 2. 현재 위치의 문자가 + 이면서, -가 발견되지 않았다면 앞 계산결과에 더한 후, 계산 결과로 저장한다.
2 - 3. 현재 위치의 문자가 + 이지만, -가 발견이 됬었다면, 발견 이후의 계산 결과에 2 - 1 과정을 통해 구해진 값을 더한다.
2 - 4. -가 발견이 되면, - 발견 플래그를 세운다.
3. 2에서 구한 발견 이전의 값에서 발견 이후의 값을 뺀 결과를 출력한다.
소스코드
#include <iostream>
#include <stack>
#include <cstring>
using namespace std;
const int MAX = 50;
char input[MAX+1];
int main()
{
cin >> input;
stack<int> opnd;
bool foundMinus = false;
int digit = 0;
char oper = '+';
for (int i = 0; true; i++)
{
if (input[i] == 0)
{
if (foundMinus)
digit *= -1;
opnd.push(digit);
while (opnd.size() > 1)
{
int opnd1 = opnd.top(); opnd.pop();
int opnd2 = opnd.top(); opnd.pop();
opnd.push(opnd1 + opnd2);
}
break;
}
else if ('0' <= input[i] && input[i] <= '9')
digit = (digit * 10) + (input[i] - '0');
else
{
oper = input[i];
if (foundMinus)
digit *= -1;
if (oper == '-')
foundMinus = true;
opnd.push(digit);
digit = 0;
}
}
cout << opnd.top();
return 0;
}
'Algorithm > Greedy Algorithm' 카테고리의 다른 글
Baekjoon 1931 회의실 배정 (0) | 2019.06.02 |
---|---|
Baekjoon 1080 행렬 (0) | 2019.04.01 |
Baekjoon 1049 기타줄 (0) | 2019.01.16 |
BaekJoon 2875 대회 or 인턴 (0) | 2019.01.16 |
BaekJoon 10610 30 (0) | 2019.01.16 |