백준 10799 쇠막대기 / C++

이유참치·2025년 12월 15일

백준

목록 보기
125/249

문제 : 링크텍스트

풀이 point

쇠막대기인지 레이저인지를 파악하기 위해 닫힌 괄호를 만나면 그 앞이 열린 괄호인지 확인해야한다 ex : ()
만약 열린 괄호가 아닌 닫힌 괄호라면 막대기의 끝이므로 1을 더해주어야한다.
-> 2개의 레이저로 한 막대를 나누면 3개가 되기 때문
닫힌 괄호를 만났을 때 앞이 열린 괄호라면 레이저이므로 앞에 막대기가 몇 개있었는지 파악후 더해주면된다. 이것은 스택의 size로 파악할 수 있다.

undefined

풀이 순서

  1. 입력 처리
  2. 열린 괄호 스택 push
  3. 닫힌 괄호 만났을 때 앞이 열린 괄호인지 아닌지 파악
    4-1. 열린 괄호라면 스택 size를 파악하여 더해줌
    4-2. 닫힌 괄호라면 막대기의 끝이므로 1을 더해줌
    4-3. 스택에서 짝인 괄호를 삭제

코드

#include <iostream>
#include <vector>
#include <queue>
#include <stack>

//백준 10799, 쇠막대기

int main(){
    std::stack<char> stack;
    std::string s;
    std::cin >> s;
    int num{0};

    for(int i{0}; i<s.size(); ++i){
        if(s[i] == '(') stack.push('(');
        else if(s[i] == ')' && s[i-1] == '('){
            stack.pop();
            num += stack.size();
        }
        else{
            ++num;
            stack.pop();
        }
    }
    
    std::cout << num;
    
    
    return 0;
}
profile
임아리 - 대학생

0개의 댓글