본문 바로가기

코딩테스트 연습/Baekjoon

[Baekjoon] 10799번: 쇠막대기 (c++)

https://www.acmicpc.net/problem/10799

 

10799번: 쇠막대기

여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저

www.acmicpc.net

  1. (이 들어오면 스택에 (를 push한다
  2. ) 가 들어오면 그전에있는 stack을 확인해서 (이면 st의 사이즈를 더한다 (레이저)
  3. ) 가 들어오면 그전에있는 stack을 확인해서 )이면 1을 더한다 (파이프의 끝)
if( st.top() == '(') cnt += st.size();

에서 스택이 비어있을때 top을 참조하면 런타임 에러가 남 => if(!st.empty()) 조건을 추가해서 해결

 


코드

#include <iostream>
#include <stack>
using namespace std;

int main(int argc, const char *argv[])
{
    string input;
    int cnt=0;
    stack<int> st;

    getline(cin, input);

    for(int i=0;i<100001;i++){
        if(input[i] == '\0') break;

        if(input[i] == '(') st.push('(');
        else if(input[i] == ')' && input[i-1] == '(') {
            st.pop();
            if(!st.empty()){
            if( st.top() == '(') cnt += st.size();
            }
        }
        else if(input[i] == ')' && input[i-1] == ')') { //파이프
            st.pop();
            cnt += 1;

        }
    }

    cout<< cnt;
    return 0;
}