본문 바로가기
알고리즘

백준 C++ - 스택, 괄호 (9012)

by jun.s.gi 2023. 2. 9.
728x90

https://www.acmicpc.net/problem/9012

 

9012번: 괄호

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고

www.acmicpc.net

스택을 이용한 기본적인 알고리즘 문제이다.

 

접근 방법

1. '(' 열린 괄호가 들어오면 스택에 쌓는다.

2. ')' 닫힌 괄호가 들어오면 스택에 열린 괄호 하나를 빼낸다.

3. 마지막에 스택에 괄호가 남아 있거나 혹은 비어 있지만 빼내야 하는 경우 "NO" 출력

#include <stdio.h>
#pragma warning(disable:4996)

char a[60], b[2][10] = { "YES", "NO" };
int main()
{
	int n, sw, key; // 
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
	{
		scanf("%s", a);
		key = -1; // 스택을 가리키는 key
		sw = 0; // YES로 초기화
        
		for (int j = 0; a[j]; j++)
		{
			if (a[j] == '(') ++key; // 열린 괄호라면 삽입
			else --key; //  닫힌 괄호라면 빼냄
            
			if (key < -1) sw = 1; // 빼낼 것이 없는데도 빼낼 시 NO
		}
		if (key > -1) sw = 1; // 스택에 자료가 남아있으면 NO
		printf("%s\n", b[sw]);
	}
}

소괄호만 입력을 받고 출력에 괄호가 필요없으니 굳이 스택 배열에 쌓지 않고도 문제를 맞힐 수 있다.

728x90