[알고리즘] 쇠막대기 - 백준 10799

se.jeon·2023년 3월 3일
0

알고리즘

목록 보기
11/21

문제


과정

처음에는 막연히 닫을 때 마다 개수를 더해주면 되겠다, 싶었는데.. 결과 값이 제대로 나오지를 않았다.
그래서 예시 출력을 다시 보면서 세어 보았다.
레이저만 있는 것은 아무것도 잘리지 않으며, 자른 곳은 2등분된 개수를 세야 한다는 문제가 있었다. 그래서 구분 분기를 주었다.

여는 괄호를 만날 때 마다 push를 해 주고,
닫는 괄호가 나왔을 때 pop을 해 준다.
닫는 괄호가 나왔을 때는 이 괄호가 레이저인지, 막대의 끝인지 구분 해 준다.
레이저면 가지고 있는 스택의 길이만큼 더하고, 막대의 끝이면 끝자락의 개수인 1을 더해준다.

결과

//
// Created by 전시은 on 2023/03/03.
//
// 문제 :: 쇠막대기
// 링크 :: https://www.acmicpc.net/problem/10799
// 입력 :: 한 줄에 쇠막대기와 레이저의 배치를 나타내는 괄호 표현이 공백없이 주어진다. 괄호 문자의 개수는 최대 100,000이다.
// 출력 :: 잘려진 조각의 총 개수를 나타내는 정수를 한 줄에 출력한다.

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


int main()
{
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);

    string sInput;
    stack<char> sPipes;
    int nCount = 0;

    cin >> sInput;

    for(int i = 0; i < sInput.length(); i++)
    {
        if(sInput.at(i) == '(')
        {
            sPipes.push('(');
        }
        else if(sInput.at(i) == ')')
        {
            sPipes.pop();

            if(sInput.at(i - 1) == '(')
            {
                nCount += sPipes.size();
            }
            else
            {
                nCount++;
            }
        }
    }

    cout << nCount;

    return 0;
}
profile
취미 다이소

0개의 댓글