1541 잃어버린 괄호
1541. 잃어버린 괄호 / c++ / Silver2 / 1시간
문제 및 코드
새로운 코드
#include <iostream>
#include <string>
#include <queue>
using namespace std;
queue<char> OperQueue;
queue<int> NumberQueue;
int main()
{
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
string Input;
cin >> Input;
string Num = "";
for (int i = 0; i < Input.length(); ++i)
{
if (Input[i] == '+' || Input[i] == '-')
{
NumberQueue.push(stoi(Num));
Num = "";
OperQueue.push(Input[i]);
}
else
{
Num += Input[i];
}
}
NumberQueue.push(stoi(Num));
int Result = NumberQueue.front(); NumberQueue.pop();
while (OperQueue.empty() == false)
{
if (OperQueue.front() == '+')
{
OperQueue.pop();
Result += NumberQueue.front(); NumberQueue.pop();
}
else
{
// sub operator
OperQueue.pop();
int Current = NumberQueue.front(); NumberQueue.pop();
while (OperQueue.empty() == false && OperQueue.front() == '+')
{
OperQueue.pop();
Current += NumberQueue.front(); NumberQueue.pop();
}
Result -= Current;
}
}
cout << Result << '\n';
return 0;
}
접근 방식
큐 / 파싱
- 문자열을 각각 숫자 문자열과 연산자 문자열로 파싱하여 벡터에 삽입
ex) { “55”, “-“, “50”, “+”, “40” } - 해당 백터를 아래와 같이 백트래킹
- 벡터를 순회하며 연산자를 발견하면 왼쪽 숫자 , 연산자 , 오른쪽 숫자를 지역 변수에 저장 후 벡터에서 제거
- 저장한 변수들로 결과값을 산출한 뒤 다시 벡터에 삽입
- 백트래킹
- 백트래킹 종료 후 결과값을 벡터에서 제거한 뒤 다시 왼쪽 숫자, 연산자, 오른쪽 숫자를 벡터의 기존 위치에 삽입한다.
- 시간초과
- 규칙을 찾아야 했다.
- ’+’ 연산자가 온다면 결과값에 더한다.
- ’-‘ 연산자가 오면 그 뒤의 ‘-‘ 연산자 전까지의 모든 값을 더해서 기존의 결과값에서 뺀다.
- 해결
다시 생각해 볼 점
- 그리디 알고리즘이었던 이유가 한번 빼기 연산자가 나온다면, 그 뒤의 더하기 연산자를 모두 더해서 가장 큰 값을 만들어서 빼기 때문이라고 생각했다.
- 이전에 풀었던 문제였는데도, 백트래킹으로 시도했다 시간초과가 뜨고 규칙을 찾는데 시간이 꽤 걸렸다. 우선 문제를 정확하게 분석하는 습관이 필요할 것 같다.