티스토리 뷰

백준 온라인 저지(BOJ) 4949번 균형잡힌 세상
https://www.acmicpc.net/problem/4949
4949번: 균형잡힌 세상
각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"), 대괄호("[ ]")로 이루어져 있으며, 온점(".")으로 끝나고, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마지막에
www.acmicpc.net
* 사용언어 : C언어, C++
1. 문제
소괄호("()")와 대괄호("[]") 2종류를 포함하는 문자열이 주어짐
모든 괄호가 1:1 매칭되면서 짝을 이루는 균형잡힌 문자열인지 여부를 출력

2. 풀이
문자열을 순차적으로 읽어가면서 왼쪽 괄호가 나오면 Stack에 넣고(push),
오른쪽 괄호가 나오면 Stack의 top에 있는 문자열을 확인하고 제거(pop)하는 방식으로 구현했습니다.
괄호 외에 공백이나 알파벳은 균형잡힌 문자열 판단과 관련이 없으므로 처리하지 않고 넘어가면 됩니다.
오른쪽 괄호가 나왔을 때, 아래 3가지 중 하나라도 해당되면 균형잡힌 문자열이 아닌 것으로 판단했습니다.
- Stack Size가 0일 때 (짝이 맞는 왼쪽 괄호가 없음)
- 오른쪽 괄호가 ')' 인데, Stack의 Top이 '(' 이 아닐 때
- 오른쪽 괄호가 ']' 인데, Stack의 Top이 '[' 이 아닐 때
문자열을 다 탐색한 후에는 왼쪽 괄호가 남은 경우를 잡아내야 하기 때문에 Stack Size를 확인했습니다.
(size가 0이 아니면 균형잡힌 문자열이 아님)
추가로 자주 사용하는 scanf는 '\0'(공백) or '\n'(enter)의 직전 문자까지 입력받으므로 이 문제에는 적합하지 않았습니다.
개행 전까지 모든 문자를 한 번에 입력받기 위해서 공백에서도 끊지 않고 문자로 입력받는 fgets를 사용했습니다.
참고로 fgets는 '\n' 문자까지 모든 문자를 입력받고, 그 뒤에 '\0'까지 추가해줍니다.

따라서 input 문자열의 크기를 102까지 해야 정답 처리가 됩니다.
변수 선언 순서에 따라 100개 혹은 101개로도 정답이 될 수 있으나
저는 101개로 제출했을 때 오답이었습니다.

3. 코드
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif
/*
4949_균형잡힌 세상
1116KB 4ms
*/
#include <cstdio>
const int LM = 102;
char str[LM], stack[LM], *c;
int size, isValid;
int main() {
#ifdef _WIN32
freopen("input.txt", "r", stdin);
#endif // _WIN32
while (1) {
fgets(str, LM, stdin);
c = str;
if (*c == '.') break;
size = 0, isValid = 1;
while (*c != '.') {
if (*c == '(' || *c == '[') stack[size++] = *c;
else if (*c == ')' || *c == ']') {
if (size == 0
|| (*c == ')' && stack[size - 1] != '(')
|| (*c == ']' && stack[size - 1] != '['))
{
isValid = 0;
break;
}
--size;
}
++c;
}
if (isValid && !size) printf("yes\n");
else printf("no\n");
}
return 0;
}
'개발자 > 문제풀이 (C언어)' 카테고리의 다른 글
| [백준/BOJ] 18258번 큐 2 (C/C++) (0) | 2023.11.17 |
|---|---|
| [백준/BOJ] 12789번 도키도키 간식드리미 (C/C++) (0) | 2023.11.16 |
| [백준/BOJ] 9012번 괄호 (C/C++) (0) | 2023.11.10 |
| [백준/BOJ] 10773번 제로 (C/C++) (0) | 2023.11.10 |
| [백준/BOJ] 28278번 스택 2 (C/C++) (0) | 2023.11.10 |
- Total
- Today
- Yesterday
- 알고리즘
- 당신도느리게나이들수있습니다
- 세상을 읽는 새로운 언어 빅데이터
- 동탄에듀센터2
- 쿠프마케팅
- 삼성전자
- 시대예보
- 정올
- 자동차보험
- 나의첫죽음학수업
- 아가별
- 정세현의통찰
- 동탄에듀센터
- 독서감상평
- 이용제한
- 독서 감상평
- 자료구조
- 유연함의힘
- 이상감지
- 영화감상평
- 똑똑하고게으르게
- 시스템개발자
- 센터독서클럽
- 최재천의공부
- 여가포인트
- 관계가상처가되기전에
- 인간본성불패의법칙
- 문현공
- JUNGOL
- 마침내 특이점이 시작된다
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |