[알고리즘] 8강 스택의 활용

mmmYoung·2022년 7월 6일
0

알고리즘

목록 보기
8/13

스택을 이용한 괄호 쌍

백준10799 쇠막대기

풀이

쇠막대기의 끝부분과 레이저 포인터를 구분하는 코드가 필요하다.
스택과 입력받은 문자열을 모두 활용해서 푼 문제

#include <iostream>
#include <stack>

using namespace std;

int main()
{
    stack <char> st;
    string order;
    int answer=0;
    cin >> order;
    
    st.push(order[0]);
    for(int i=1; i<order.length(); i++){
        if(order[i]=='('){
            st.push('(');
        }
        else{
            if(order[i-1] == '('){
                st.pop();
                answer+=st.size();

            }
            else{
                st.pop();
                answer+=1;
            }

        }
        
    }
    cout << answer;
    return 0;
}

백준2504 괄호의 값

풀이

열리는 괄호가 들어올 때는 스택에 푸시하며 tmp값을 2배 or 3배처리 해준다. 그 뒤로 닫히는 괄호가 들어올 때 바로 이전 문자가 열린 괄호라면 숫자 2 또는 3이고, tmp값을 곱한 값을 answer에 더해준다.
그뒤로 올바른 입력인 지 아닌 지 스택이 비어있는지를 통해 확인해줌!
런타임 에러로 조금 헤맸다... 스택 top,pop할 때 비어있는 경우 체크 꼭꼭 하기
더 깔끔하게 풀 수 있을 것 같은데 방법을 찾아보자
내 작년 풀이에서는 스택없이 tmp와 문자열 대칭을 통해 풀었다...!

#include <iostream>
#include <stack>

using namespace std;

int main()
{
    stack <char> st;
    string order;
    int answer=0;
    int tmp=1;
    cin >> order;
    
    st.push(order[0]);
    if(order[0]=='(') tmp*=2;
    else if(order[0]=='[') tmp*=3;
    else {
        cout << 0;
        return 0;
        
    }
    
    for(int i=1; i<order.length(); i++){
        if(order[i]=='('){
            st.push(order[i]);
            tmp*=2;
        }
        else if(order[i]=='['){
            st.push(order[i]);
            tmp*=3;
        }
        else if(order[i]==')'){
            if(st.empty()){
                cout << 0;
                return 0;
            } 
            else if(st.top()=='('){
                if(order[i-1]=='('){
                    answer+=tmp;
                }
                st.pop();
                tmp/=2;
            }
            else {
                cout << 0;
                return 0;
            }
        }
        else{
            if(st.empty()){
                cout << 0;
                return 0;
            } 
            else if(st.top()=='['){
                if(order[i-1]=='['){
                    answer+=tmp;
                }
                st.pop();
                tmp/=3;
            }
            else {
                cout << 0;
                return 0;
            }
        }
        
    }
    if(!st.empty() || tmp!=1) answer=0;
    cout << answer;
    return 0;
}
profile
안냐세여

0개의 댓글