Programmers 42585

Posted by Damin on January 16, 2020

쇠막대기

문제 링크

괄호 문제는 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;
}