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 |