포스트

[백준][4949] 균형잡힌 세상

요구사항 분석

여러 문자들이 섞여있는 문자열이 입력될 때,
이 문자열 속 소괄호와(“()”) 대괄호(“[]”)의 짝이 옳바른지 확인하는 문제입니다.


알고리즘 선택

괄호를 확인할 때, 입력된 순서의 역순으로 반대편 괄호가 있어야 짝이 성립되는 것이므로
FILO 구조의 컨테이너인 STACK 을 사용하여 구현하였습니다.


풀이 분석

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
32
33
34
35
36
37
38
39
#include <iostream>
#include <string>

int main() {
	while (true) {
		std::string buf;
		std::getline(std::cin, buf);
		if (buf == ".") break;
		std::string check_str;
		bool answer = true;
		for (char c : buf) {
			if (c != '(' && c != ')' && c != '[' && c != ']') continue;
			
			if (c == '(' || c == '[') {
				check_str.push_back(c);
				answer = false;
			} else if (false == check_str.empty()) {

				if ((*check_str.rbegin() == '(' && c == ')')
					|| (*check_str.rbegin() == '[' && c == ']')) {
					check_str.pop_back();
					answer = true;
				}
				else {
					answer = false;
					break;
				}
			}
			else {
				answer = false;
				break;
			}
		}
		if (answer && check_str.empty()) printf("yes\n");
		else printf("no\n");
	}
	return 0;
}   
   


최적화

std의 cin 함수는 공백을 기준으로 입력을 받으므로 string lib에 있는 getline을 사용하였고
stack 이라는 lib도 존재하지만 string이 vector로 구현되어 있으며
vector의 push_back, pop_back 만으로 충분이 구현이 가능하였습니다.


이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.