문제: 10799번: 쇠막대기
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
string input;
cin >> input;
int cnt = 0;
stack<char> sticks;
char prev;
for (int i = 0; i < input.size(); i++) {
if (input[i] == '(') {
sticks.push('(');
}
else {
if (prev == '(') {
sticks.pop();
cnt += sticks.size();
}
else {
sticks.pop();
cnt += 1;
}
}
prev = input[i];
}
cout << cnt << "\n";
return 0;
}
처음에는 그냥 ')' 이걸 만날때마다 스택에서 하나 지우고, 그 후 스택의 size 를 더해주는 식으로 구현했는데 첫번째 예제만 맞고 나머지는 틀렸다.
그래서 더 생각해본 결과 ')' 를 만났을 때 무조건 스택의 size 를 더하는게 아니라 이전 문자를 보고 판단했어야 했다. 무슨 의미냐면 ')' 이전의 문자가 '(' 이었다면 레이저인 거니까 스택에서 pop 한 후, 스택의 size 를 더하는 것이고, 만약 이전의 문자가 ')' 였다면 레이저가 아닌 거니까 스택에서 pop 한 후, 그냥 1을 더하는 것이었다.
-_-;; 실버 문제인데 좀 많이 헤매서 우울하다. 그래도 이번에 새로운거 하나 알아갔다고 생각하기로 했다.
참고자료:
-> 잘 정리해놨길래 가져와봤다.