쇠막대기
괄호 문제는 stack 을 이용하자
stack에는 ‘(‘의 index만 넣자!
1
2
3
4
5
6
7
8
9
10
11
12
13
1. ‘(‘를 만났을 때
A. 그 다음 것이 ‘)’ 이라면, 레이저라는 뜻
i. 따라서, 만약 stack에 저장된 값이 있다면 top의 index ++
ii. 없다면 그냥 for문의 i를 ++
B. 그 다음 것이 ‘)’ 가 아니라면
i. 그 위에 막대기를 놓는 다는 뜻 -> 그냥 stack에 push
2. ‘)’를 만났을 때
A. 일단 ‘)’를 만났다는 것은 stack에 저장된 값이 있다는 뜻
i. Stack의 top 인덱스를 꺼내서 pop한 뒤에(이미 저장이 다 끝난 것)
ii. Stack의 저장된 값이 없다면 (ex. ‘((()()))’ ) 처리 x
iii. 있다면 그 인덱스에 저장한 인덱스를 더해준다(+=)
3. 마지막에 for문으로 순회하면서
A. 값이 있다면 answer에 더해준다. 이때, +1을 해준다 (레이저 1개는 쇠막대기 2개를 만듦)
Code
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
#include <string>
#include <vector>
#include <stack>
#include <iostream>
using namespace std;
int solution(string a) {
stack<int>s;
int temp[100000] = {0,};
int answer = 0;
for(int i=0; i<a.size(); i++){
char now = a[i];
if(now == '('){
if(a[i+1] == ')'){
if(s.size()){
int tempIndex = s.top();
temp[tempIndex]++;
}
i++;
}
else s.push(i);
}
else{
int tempIndex = s.top();
s.pop();
if(s.size()){
int nowIndex = s.top();
temp[nowIndex] += temp[tempIndex];
}
}
}
for(int i=0; i<a.size(); i++){
if(temp[i]) answer+=(temp[i]+1);
}
return answer;
}