728x90
SMALL
백준 문제 풀이: 4949 [균형잡힌 세상]
문제 링크: https://www.acmicpc.net/problem/4949
문제 설명:
주어진 문자열이 균형잡힌 괄호 문자열인지 판단하는 문제입니다. 균형잡힌 문자열은 다음 조건을 만족해야 합니다:
- 모든 여는 괄호 '(' 또는 '['가 적절한 닫는 괄호 ')' 또는 ']'와 매칭되어야 한다.
- 괄호가 중첩되는 경우, 올바른 순서로 닫혀야 한다.
문자열의 끝은 항상 마침표('.')로 표시되며, 입력이 '.' 하나만 있을 경우 프로그램을 종료합니다.
문제 해결 코드
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
while (1) {
string s;
stack<char> a;
int check = 1;
getline(cin, s);
if (s == ".") {
break;
} else {
for (int i = 0; i < s.length(); i++) {
if (s[i] == '(' || s[i] == '[') {
a.push(s[i]);
} else if (s[i] == ')') {
if (a.empty()) {
check = 0;
break;
} else if (a.top() == '(') {
a.pop();
} else if (a.top() == '[') {
check = 0;
break;
}
} else if (s[i] == ']') {
if (a.empty()) {
check = 0;
break;
} else if (a.top() == '[') {
a.pop();
} else if (a.top() == '(') {
check = 0;
break;
}
}
}
if (a.empty() && check) {
cout << "yes" << '\n';
} else {
cout << "no" << '\n';
}
}
}
}
코드 설명
- 핵심 알고리즘: 스택을 이용하여 괄호의 여닫힘 상태를 추적
- 구현 세부사항:
- 문자열을 한 글자씩 확인하며, 여는 괄호는 스택에 추가
- 닫는 괄호는 스택의 최상단과 비교하여 매칭 여부 확인
- 스택이 비어있는 상태에서 닫는 괄호가 나오거나 매칭이 불가능할 경우 문자열은 균형잡히지 않은 것으로 판정
- 시간 복잡도: O(n)
- 문자열의 길이 n에 대해 한 번의 순회로 처리 가능
결과
주어진 문자열에 대해 균형잡힌 괄호 문자열인지 여부를 출력합니다. 균형잡힌 경우 yes
, 그렇지 않은 경우 no
를 출력합니다.
다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!
728x90
LIST
'BAEKJOON > 자료 구조' 카테고리의 다른 글
백준 10773번 [제로](C++)-yes6686- 티스토리 (0) | 2024.01.03 |
---|---|
백준 9012번 [괄호](C++)-yes6686- 티스토리 (0) | 2024.01.03 |
백준 2164번 [카드2](C++)-yes6686- 티스토리 (0) | 2024.01.02 |
백준 14428번 [수열과 쿼리 16](C++)-yes6686- 티스토리 (1) | 2024.01.02 |
백준 11505번 [구간 곱 구하기](C++)-yes6686- 티스토리 (1) | 2024.01.01 |