Problem Solving/BOJ

[백준 10799번] 쇠막대기

  • -
728x90
반응형

이 문제의 경우에서 가장 중요한 부분은 )가 등장했을 때, 막대기의 끝인지 레이저인지 구분하는 것이다.

레이저는 바로 앞의 값이 (이면 되고, 막대기의 끝은 바로 앞의 값이 )이면 된다.

 

이것을 기준으로 막대기의 갯수를 체크하면 된다.

단, 막대기의 갯수는 (의 갯수를 통해서 계산할 수 있는데 레이저가 나오거나 막대기의 끝이면 (의 갯수에서 -1을 시켜주면 된다.

 

해당하는 알고리즘으로 코드를 구현하면 다음과 같다.

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <cstdlib>

using namespace std;

int main(void){
    string input_data;
    cin >> input_data; // input data

    int len_data = input_data.size();
    int result = 0;
    int count = 0;

    for(int i = 0; i < len_data; i++){
        
        // 레이저 후보지점

        if(input_data[i] == ')'){

            // 레이저 목록

            if(input_data[i - 1] == '('){
                count -= 1; // 막대기가 늘어난 것이 아니므로 -1
                result += count; // 자른 막대기 갯수
            }

            // 레이저가 아님(막대기의 끝) : 막대기 찌꺼기 1개 증가

            else{
                count -= 1; // 막대기가 끝났으므로 지움
                result += 1;
            }
        }

        // 일반적으로 ( 의 갯수는 막대기 갯수
        
        else{
            count += 1;
        }
    }

    cout << result << "\n";
    return 0;
}
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.