BOJ

BOJ 1541번 : 잃어버린 괄호

00rigin 2020. 11. 16. 12:44

문제를 읽어보면 알겠지만 논리적으로는 굉장히 쉬운 문제이다.

다만 입력을 문자열로 받기에 그 부분을 처리하는데 있어 조금 귀찮을 뿐이다.

 

<Solution>

 

예를들어 55-50+40 이 주어질 경우, 가장 작은 값을 만들기 위한 괄호는 55-(50+40) 이다.

 

즉, 55-50-40 으로 만들면 된다는 것이다.

 

이를 위해 음수 이후의 덧셈을 모두 뺄셈 처리를 해주면 해결된다.

 

위 처럼 계산을 해주기 위해 문자열을 적절히 처리하여 배열에 {55, -50, 40} 으로 넣어주었다.

 

위 배열처럼 만들기 위해 아스키 코드 값을 기준으로 숫자를 분류하였고, atoi() 를 사용하여 정수값으로 변환 시켰다.

 

<소스코드>

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include<iostream>
#include<string>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<utility>
#include<queue>
using namespace std;
 
void Solve(string s) {
    int res = 0;
    vector<int> v;
    string tem = "";
 
    for (int i = 0; i < s.length(); i++) { // 나눠서 배열에 넣음
 
        if (s[i] == '-' || s[i] == '+') { // 문자일때
            v.push_back(atoi(tem.c_str()));
            tem = "";
            tem = tem + s[i];
        }
        else if (s[i] <= 57 && s[i] >= 48// 숫자일때
            tem = tem + s[i];
 
        if (i == s.length() - 1)           // 마지막은 문자이므로
            v.push_back(atoi(tem.c_str()));
    }
 
    res = v[0];
    bool flag = false;
 
    for (int i = 1; i < v.size(); i++) {
 
        if (v[i] < 0) { // 음수 나오면 뒤에 더하기 다 음수처리 하기위한 플래그 설정
            res += v[i];
            flag = true;
        }
        else if (flag)  // 앞에 음수였으면 더하기 다 빼버림
            res -= v[i];
        
        else           // 나머진 더함
            res += v[i];
 
    }
    cout << res;
 
}
 
int main() {
 
    string s;
    cin >> s;
 
    Solve(s);
}

 

<문제>

www.acmicpc.net/problem/1541

 

1541번: 잃어버린 괄호

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다

www.acmicpc.net