728x90
https://www.acmicpc.net/problem/1541
1541번: 잃어버린 괄호
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다
www.acmicpc.net
첫번째 시도
덧셈을 먼저 진행 후, 나중에 뺄셈을 진행해야 한다고 생각해서 operands, operations Vector를 두 개 만들어 덧셈->뺄셈 순서로 진행하는 방법을 생각했지만 매우 비효율적인 방법으로 생각되어 다른 방법을 생각함
두번째 시도
뺄셈이 나오면 뒷부분의 +는 -로 바꾸어 계산하는 방법을 생각함. 그런데 -의 경우, 부호를 바꾸면 +가 되기 때문에 이를 고려해야 한다고 생각함.
예를 들어 30 - 50 + 40 - 30 + 20의 경우,
30 - (50 + 40) - (30 + 20) 가 -110으로 정답이지만,
30 - (50 + 40 - 30 + 20) 전혀 다른 답이 나온다.
따라서, -를 따로 처리해야 한다고 생각했다.
다른 블로그를 참고한 결과
+20은 -30의 -을 영향을 받기에 , -50의 -을 적용받던 -30의 -을 적용받던 상관이 없다.
-30의 경우 -50의 - 를 영향받지 않고, -30으로 계산되어야 하기 때문에,
앞쪽에서 한 번 -가 오면 뒷 부분은 무조건 - 로 바꾸어 계산을 하면
뒤 부분의 - 가 + 로 바뀌는 부분을 생각하지 않고 코드를 작성 할 수 있다.
#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>
#include <string>
using namespace std;
vector<int> operands;
vector<char> operations;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string str;
cin >> str;
string num;
int res = 0;
bool minus = false;
for (int i = 0; i <= str.length(); i++) {
if (str[i] == '+' || str[i] == '-' || i == str.length()) {
if (minus) {
res -= stoi(num);
}
else {
res += stoi(num);
}
num = "";
}
else {
num += str[i];
}
if (str[i] == '-')
minus = true;
}
cout << res;
}
728x90
'📊알고리즘 > BOJ' 카테고리의 다른 글
BOJ 2170 선 긋기 (1) | 2024.02.05 |
---|---|
[그리디 #3] 카드 합체 놀이 (0) | 2024.02.05 |
[그리디 #1] BOJ 11501 주식 (0) | 2023.11.10 |
{BOJ 2839} 설탕 배달 (DP) (0) | 2023.09.24 |
[DP #24] (BOJ 2225) 합분해 (0) | 2023.09.07 |