https://www.acmicpc.net/problem/10799
cnt
: 잘려진 쇠막대기 조각의 총 개수
stack
: 현재 있는 쇠막대기의 개수
text
: 입력받은 문자열
왼쪽부터 한 글자씩 for문을 이용하여 체크한다.
쇠막대
쇠막대가 열릴 경우
(
모양일 때는 쇠막대가 열릴 경우일 수도 있고, 레이져일 수도 있다.
이는 후에 검사한다.
text[i] == '('
- 일단 이 경우에는
stack
에push(text[i])
하여 쇠막대의 개수를 하나 늘려준다.쇠막대가 닫힐 경우
- 쇠막대가 닫힐 경우는
))
이 모양 일 때이다.
text[i-1] == ')' && text[i] == ')'
stack
에서pop()
하여 쇠막대의 개수를 하나 줄여주고,cnt++
해준다.
레이저
- 레이져가 나오는 경우는
()
이 모양
text[i-1] == '(' && text[i] == ')'
- 아까 쇠막대에 일단 +1 했던 걸
stack
에서pop()
하여 쇠막대의 개수를 하나 줄여주고cnt
에 현재 있는 쇠막대 개수(stack.size()
)만큼 더해준다.
#include <iostream>
#include <string>
#include <stack>
using namespace std;
stack<char> a;
int main(){
string text;
cin >> text;
int cnt = 0;
for (int i=0; i<text.length(); i++){
if(text[i] == '('){
a.push(text[i]);
}
else if (text[i-1] == '(' && text[i] == ')'){ // 레이져
a.pop();
cnt += a.size();
}
else if (text[i-1] == ')' && text[i] == ')'){ // 쇠막대 끝
a.pop();
cnt ++;
}
}
cout << cnt << '\n';
return 0;
}
접근 방법은 맞았는데 넘 어렵게 풀 뻔~