728x90
1541번: 잃어버린 괄호
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다
www.acmicpc.net
<아이디어>
가장 처음과 마지막은 숫자이고, 두 개 이상의 연산자는 나타나지 않는다.
그럼 숫자가 N개라면 연산자는 N-1개이다.
숫자는 vector에, 연산자는 queue에 저장하고 숫자를 한칸씩 가면서 계산한다.
최솟값을 만들기 위해 '-'연산자 뒤에 나오는 '+'연산자에 해당하는 숫자들을 모두 더하여 한번에 뺀다.
경우의 수는 다음과 같다.
- queue에서 '-'가 나온 경우, 빼기 위해 저장되어있는 값을 결과값에서 뺀 다음 다시 저장한다.
- queue에서 '+'가 나온 경우, 저장된 값이 있다면 (이전에 '-' 가 나왔다면) 저장된 값에 더한다.
- queue에서 '+'가 나왔지만 저장된 값이 없다면 결과값에 더한다.
마지막에 빼기위해 저장된 값을 결과값에서 뺀다.
|
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 <bits/stdc++.h>
using namespace std;
#define swap(a,b) (a)^=(b)^=(a)^=(b)
#define endl '\n'
typedef long long lld;
int main()
{
ios_base::sync_with_stdio(NULL);
cin.tie(NULL);
cout.tie(NULL);
string s;
cin>>s;
vector<int> v;
queue<char> op;
v.push_back(0);
for(int i=0;i<s.length();i++)
{
if(s[i]=='-' || s[i]=='+')
{
op.push(s[i]);
v.push_back(0);
}
else if(s[i]>='0' && s[i]<='9')
{
*(v.end()-1) *= 10;
*(v.end()-1) += s[i]-'0';
}
}
lld ans = (lld)v[0], sub = 0;
for(int i=1;i<v.size();i++)
{
if(op.front()=='-')
{
ans -= sub;
sub = 0;
sub += v[i];
}
if(op.front()=='+')
{
if(sub) sub += v[i];
else ans += v[i];
}
op.pop();
}
if(sub) ans -= sub;
cout<<ans;
return 0;
}
|
cs |

728x90
'Problem Solving > BOJ 문제풀이' 카테고리의 다른 글
| 5525 IOIOI (0) | 2021.01.11 |
|---|---|
| 1992 쿼드트리 (0) | 2021.01.11 |
| 7662 이중 우선순위 큐 (0) | 2021.01.08 |
| 11687 팩토리얼 0의 개수 (0) | 2021.01.04 |
| 14889 스타트와 링크 (0) | 2021.01.02 |