https://www.acmicpc.net/problem/4949
난이도: 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;
}