본문 바로가기
🧑‍💻코딩 테스트/백준 (BOJ)

[백준 알고리즘/ C++] BOJ.9012 : 괄호

by 코코의 주인 2022. 1. 31.

 


풀이

자료구조

- char stack[] : 스택으로 사용할 배열
- int top : top으로 쓸 변수
- int count : 테스트케이스 수
- string str : 입력받은 문자열
- int length : 문자열 길이

 

알고리즘

- 스택

 

코드

- C++은 string이라는 문자열을 처리하기에 유리한 변수가 있기 때문에 사용

- getline() 함수를 사용하면 문장을 개행문자(\n) 전까지 한 번에 입력받을 수 있음
- cin.ignore() 함수를 사용해서 입력버퍼 제거가 가능


코드

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

char stack[50];  //스택으로 사용할 배열
int top = -1;  //top 선언 및 초기화

int isEmpty() {  //배열이 비어있는지 확인
    if(top < 0) {
        return 1;
    }
    else
        return 0;
}

void push(char input) {  //push 함수
    stack[++top] = input;
}
int pop() {  //pop 함수
    if(isEmpty()){
        return 1;
    }
    else {
        stack[top--] = 0;
    }
    return 0;
}
void reset() {  //스택 초기화
    for(int i = 0; i < 50; i++) {
        stack[50] = 0;
    }
    top = -1;
}

int main() {
    int result = 0;
    int num = 0;
    int count = 0;
    int length = 0;
    string str;

    cin >> num;
    cin.ignore();  //입력 버퍼 제거

    while(count < num) {
        getline(cin, str);  //문자열 입력
        length = str.length();
        for (int i = 0; i < length; i++) {  //문자열 길이만큼 반복
            if (str[i] == '(') {  //여는 괄호는 push
                push(str[i]);
            }
            else if (str[i] == ')') {  //닫는 괄호는 pop
                if(pop()){
                    result = 1;  //입력이 비어있을 때 pop을 시도하면 result를 1로 변경
                }
            }
        }
        if (isEmpty() && result == 0) {  //VPS면
            cout << "YES" << "\n";
            count++;
        }
        else {
            cout << "NO" << "\n";
            reset();
            result = 0;
            count++;
        }
    }
    return 0;
}

 


총평

스택을 사용하는 대표적인 문제다.

스택에 대한 함수들만 제대로 짤 수 있다면 쉽게 풀 수 있는 문제였다.

스택에 대해 잘 모르겠다면 https://cocoiscat.tistory.com/32

 

[자료구조/C++] 스택(Stack)

스택이란? 인터넷을 돌아다니다 보면 "업보 스택 쌓는다"라는 말을 들을 수 있을 것이다. 무언가 잘못을 해서 업보를 차곡차곡 쌓는다는 뜻인데, 나중에 이를 그대로 돌려받을 때 "업보 청산" 한

cocoiscat.tistory.com

정말 좋은 글이다ㅎㅎ

댓글