개발하는 kim-hasa

[c++][BOJ][10799] 쇠막대기 본문

Algorithm/BOJ

[c++][BOJ][10799] 쇠막대기

kim-hasa 2021. 11. 15. 15:42

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

 

10799번: 쇠막대기

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

www.acmicpc.net

쇠막대기가 괄호로 주어지고, ( ) 이 나타나는 경우 절단해서 조각의 개수를 구하는 문제입니다.

 

스택에 ( 가 들어오게 되면 막대기의 시작이므로 스택에 넣습니다.

스택에 ) 가 들어오게 되면 자르는 경우와 막대기가 끝나는 경우로 나뉩니다.

 

1. 자르는 경우 => ( ) 가 나타나는 경우

스택에서 ( 를 제거해야 합니다. 이때의 ( 는 막대기가 아니라 자르는 경우이기 때문입니다.

그 이후, 현재 있는 막대기의 개수만큼 잘렸으므로 count에 스택의 사이즈를 더합니다.

 

2. 막대기인 경우

자르고 남은 막대기의 개수를 더해야 합니다. 이 경우가 나올때마다 count에 1을 더합니다.

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

int main() {
    string str;
    cin >> str;
    
    stack<char> s;
    
    int count = 0;
    
    for(int i=0; i<str.length(); i++)
    {
        char c = str[i];
        char before;
        if(c == '(')
        {
            s.push('(');
            before = '(';
        }
        else
        {
            s.pop();
            if(before == '(')
            {//cut
                count += s.size();
                before = ')';
            }
            else
            {
                count++;
                before = ')';
            }
        }
    }
    
    cout << count;
}

'Algorithm > BOJ' 카테고리의 다른 글

[c++][BOJ] 영화감독 숌  (0) 2022.02.28
[c++][BOJ][1406] 에디터  (0) 2021.11.15
[c++][BOJ][1427] 소트인사이드  (0) 2021.10.28
[c++][BOJ][2941] 크로아티아 알파벳  (0) 2021.10.28
[c++][BOJ] 수들의 합  (0) 2021.10.27