백준(C언어)/23년 4월

[C] 백준 - 9012번: 괄호

C0MPAS 2023. 4. 11. 16:14

4월 11일(화) - 스택 (9012번)

 

9012번: 괄호

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

www.acmicpc.net

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

최초 생각 정리

- 자료구조 강의에서 스택관련 시간에 괄호검사 예제를 본 적 있었지만,

  이번에 다시보니 스택을 활용하지 않고도 풀이를 진행할 수 있을 것 같아서 진행해보기로 했다

- 이번 문제는 간단하게 '(' 와 ')' 만이 입력되는 상황이기 때문에 count 변수를 T번마다 매번 0으로 설정한 다음,

  '('가 입력되는 경우 +1, ')'가 입력되는 경우 -1을 해주며 count가 0인 경우에만 YES를 출력하면 될 것 같다

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

문제점

		// 수정 전
		for (int j = 0; j < len; j++)
		{
			if (string[j] == '(')
			{
				count++;
			}
			else if (string[j] == ')')
			{
				count--;
			}
		}

		// 수정 후
		for (int j = 0; j < len; j++)
		{
			if (string[j] == '(')
			{
				count++;
			}
			else if (string[j] == ')')
			{
				count--;
				if (count < 0)
				{
					break;
				}
			}
		}

1. 예제 1번에서는 YES와 NO를 제대로 판정했지만, 예제 2번에서 가장 마지막 예제를 잘못 판정하고 있음

-> 입력되는 '('와 ')'의 개수가 같아서 최종적인 count는 0이 되지만, ')'가 먼저 입력되는 경우를 고려 못 함

-> ')'가 입력되면 count에 -1을 해주다가 만약 count가 0보다 작아지는 경우, break를 해주며 종료하도록 수정

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

풀이

(스택 활용하는 풀이도 복습시에 추가할 것)

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)

#include <stdio.h>
#include <string.h>

int main(void)
{
	int T;
	scanf("%d", &T);

	char string[51];
	for (int i = 0; i < T; i++)
	{
		scanf("%s", string);

		int count = 0;
		int len = strlen(string);
		for (int j = 0; j < len; j++)
		{
			if (string[j] == '(')
			{
				count++;
			}
			else if (string[j] == ')')
			{
				count--;
				if (count < 0)
				{
					break;
				}
			}
		}

		if (count != 0)
		{
			printf("NO\n");
		}
		else
		{
			printf("YES\n");
		}
	}

	return 0;
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ