10799번 쇠막대 문제는 스택을 이용해서 풀면 쉽게 풀 수 있지만 레이저와 쇠막대의 관해서 조금 생각해 볼 필요가 있다.

비슷한 문제로는 9012번 괄호문제도 있다. 괄호문제는 뭔가 코드가 더럽게 나온거 같은데 쇠막대 문제는 논리구조가 깔끔해서 오히려 더 맘에 드는 문제이다. 쇠막대와 레이저간의 관계만 파악하면 쉽게 코드를 작성할 수 있는데 쉽게 말해 레이저가 쏘아질 때 지금까지 스택에 쌓여 있는 괄호가 쇠막대라고 생각하면 된다. 스택에 쌓여 있는 괄호만큼 레이저로 인해 쇠막대가 분리 되고 이 괄호들이 팝될 때 나머지 분리된 쇠막대가 추가 된다고 생각하면 쉽다. 



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
37
38
#include <iostream>
#include <stack>
#include <string>
using namespace std;
char a = '(';
stack<char> vpn_chk;
string vpn;
long long iron = 0;
bool recent = 0;
int main()
{
    cin >> vpn;
    int len = vpn.length();
    for (int i = 0; i < len; ++i)
    {
        char chk = vpn[i];
        if (chk == a){
            vpn_chk.push(vpn[i]);
            recent = true;
        }
        //pop 될 경우 레이저인 경우와 아닌 경우로 나뉜다.
        else
        {
            vpn_chk.pop();
            if (recent == true)
            {
                iron += vpn_chk.size();
                recent = false;
            }
            else
            {
                ++iron;
            }
        }
    }
    cout << iron;
    return 0;
}
cs



'백준 온라인 저지' 카테고리의 다른 글

백준 11053: 가장 긴 증가하는 부분 순열  (0) 2018.07.09
백준 2156: 포도주 시식  (0) 2018.07.09
백준 9465: 스티커  (0) 2018.07.09
백준 2193: 이친수  (0) 2018.07.09
백준 11057: 오르막 수  (0) 2018.07.09

+ Recent posts