[백준 / C언어] 4949번: 균형잡힌 세상

728x90
728x90

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

 

4949번: 균형잡힌 세상

각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"), 대괄호("[ ]")로 이루어져 있으며, 온점(".")으로 끝나고, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마지막에

www.acmicpc.net

 

난이도: solved.ac 실버 4

 

 

분명 맞게 짠 거 같은데 계속 10%에서 틀렸다고 떠서 맞왜틀;;;하면서 굉장히 짜증 났던 문제다...;;ㅋ

 

 

근데 진짜 틀린게 맞았음 ㅎ

 

일단 나는 스택을 이용해 문제를 풀었다

 

스택의 top을 가리키는 int형 변수 top의 초기값을 -1으로 주고

 

'(' 나 '[' 가 입력되면 '(' 와 '[' 를 스택에 넣어주고 top을 1 더해주고

 

')' 나 ']' 가 들어오면 스택의 top을 1 빼주었다

 

그리고 스택의 top위치에 '(' 가 없는데 ']' 가 들어온다거나 '[' 가 없는데 ')' 가 들어오면 no를 출력하도록 해주었다

 

또는 '(' 의 개수와 ')' 의 개수가 맞지 않다거나 '[' 의 개수와 ']' 의 개수가 맞지 않을 때도 no를 출력하게 해 주었다

 

그리고 중요한.. 내가 간과했던 부분은 바로

 

fgets는 문자열의 끝에 '\0' 를 추가로 저장한다는 거였다

 

문자열을 입력하고 enter를 칠 때 개행 문자 '\n' 를 저장하는 건 알았는데 '\0' 까지 저장한다는 건 까먹고 있었다...

 

예를 들어 fgets로 abc를 입력하고 enter를 치면

 

해당 문자열은 'abc\n\0' 으로 저장된다

 

난 문자열의 최대 길이를 101로 잡았는데 만약 100글자의 문자열이 입력되면 \0를 저장하지 못해 버린다

 

그래서 틀렸던 것...

 

실제로 내 기존 코드로 아래를 입력하면 오류가 난다

 

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

(a 100개)

 

그래서 문자열 최대 길이를 102로 바꿔주고 정답 처리를 받았다

 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#define MAX_LEN 102
char stack[MAX_LEN];

int main() {
	int top = -1, i;
	char arr[MAX_LEN];

	fgets(arr, MAX_LEN, stdin);
	while (strcmp(arr, ".\n")) {
		for (i = 0; i < strlen(arr); i++) {
			if (arr[i] == '(') {
				stack[++top] = arr[i];
			}
			else if (arr[i] == ')') {
				if (stack[top--] != '(')
					break;
			}
			else if (arr[i] == '[') {
				stack[++top] = arr[i];
			}
			else if (arr[i] == ']') {
				if (stack[top--] != '[')
					break;
			}
		}
		if (i != strlen(arr) || top != -1)
			printf("no\n");
		else
			printf("yes\n");
		top = -1;
		fgets(arr, MAX_LEN, stdin);
	}
	return 0;
}
반응형