본문 바로가기

알고리즘/백준

[BOJ 1541] 잃어버린 괄호

여기서 주목해야 할 점은, 두 연산자가 반복해서 나오지 않는다는 것이다.

 

 

 

즉, 교대로 연산자가 나타나게 된다.

 

 

 

만약에 처음 연산자가 + 라면,

 

 

 

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