여기서 주목해야 할 점은, 두 연산자가 반복해서 나오지 않는다는 것이다.
즉, 교대로 연산자가 나타나게 된다.
만약에 처음 연산자가 + 라면,
a + b - c + d - e + f,
여기서 최소의 값을 얻으려면,
a + b - (c + d) - (e + f)
형태로 괄호를 치면되고, 즉 b말고 c, d, e, f는 모두 빼주면 된다는 것이다.
나머지 경우인 처음 연산자가 - 라면,
a - b + c - d + e - f
a - (b + c) - (d + e) - f
a를 제외하고 나머지 b, c, d, e, f에 대해서 모두 빼주면 된다.
이 문제가 그리디인 이유는, 모든 경우를 보지 않고 +를 먼저 계산하게끔 괄호를 치면 정답을 구할 수 있기 때문이다.
해설코드(C++).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#include <iostream>
using namespace std;
string s;
string tmp = "";
bool flag = true;
int answer = 0;
int main() {
cin >> s;
for(int i = 0; i <= s.length(); i++){
if(s[i] == '\0' || s[i] == '+' || s[i] == '-'){
if(flag){
answer += stoi(tmp);
}else
answer -= stoi(tmp);
if(s[i] == '-')
flag = false;
tmp = "";
continue;
}
tmp += s[i];
}
cout << answer << endl;
return 0;
}
|
문자열의 끝까지 인덱스를 참조할 수 있고, 그 값은 \0이 되는 것을 유의해야 한다.
또한 문자열을 정수로 바꿔주는 함수는 stoi를 사용하면 된다.
tmp += s[i]를 하면서 append 기능을 구현할 수 있다는 것도 참고!
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ 1316] 그룹 단어 체커 (0) | 2020.06.07 |
---|---|
[BOJ 1062] 가르침(시간초과, C++, 40% 틀린이유) (0) | 2020.06.07 |
[BOJ 2533] 사회망 서비스(SNS) (0) | 2020.06.02 |
[BOJ 2503] 숫자 야구 (0) | 2020.06.01 |
[BOJ 10448] 유레카 이론 (0) | 2020.05.31 |