Baekjoon

[백준 C++] 4949번 - 균형잡힌 세상

yujin0517 2022. 2. 7. 15:00

4949번 - 균형 잡힌 세상

 

 

<코드 작성>

  1. string 타입으로 문자열 선언
  2. while문을 사용하여 "."이 입력될 경우를 반복문 탈출
  3. valance 함수를 구현하여 ()와 []가 짝이 맞을 경우와 맞기 않을 경우를 체크하여 빈 스택인지 아닌지를 반환
  4. 빈 스택일 경우 yes를 출력하고, 빈 스택이 아닐 경우 no를 출력함.

 

#include <iostream>
#include <string>
#include <stack>
using namespace std;

int valance(string exp) {
	int len = exp.length();
	stack<char> v;

	for (int i = 0; i < len; i++) {
		if (exp[i] == '(' || exp[i] == '[') {
			v.push(exp[i]);
		}
		else if (exp[i] == ')') {
			if (v.empty() || v.top() = '[') v.push(exp[i]);
			else if (v.top() == '(') v.pop();
		}
		else if (exp[i] == ']') {
			if (v.empty() || v.top() == '(') v.push(exp[i]);
			else if (v.top() == '[') v.pop();
		}
	}

	return v.empty();
}

int main() {
	string exp;
	int ret;

	while (1) {
		getline(cin, exp, '\n');

		if (exp == "." && exp.length() == 1) {
			break;
		}

		ret = valance(exp);

		if (ret == 1) cout << "yes" << '\n';
		else cout << "no" << '\n';
	}

	return 0;
}

 

valance(int 타입) 함수를 따로 선언하여 ()와 []가 짝이 맞는지 맞지 않는지를 확인하도록 구현하였습니다. 

문제를 읽고 바로 구현했을 때, 문제에 나와있는 예제를 입력하였을 때는 잘 구현되었습니다. 하지만 제출을 하니 오답이라고 결과가 나왔습니다. 

if 조건문을 사용할 때, exp[i]이 ')'와 ']'일 경우 스택이 비어있을 경우만 잘못된 경우로 체크를 하고 넘어갔던 부분 때문에 계속 오답으로 결과가 나왔던 것 같습니다.

이 경우에는 빈 스택일 경우뿐만 아니라 스택의 머리(top)에 대응되지 않는 연산자가 있는 경우(exp[i]가 ')'인데 스택의 머리에 '['이 있는 경우, 반대로 ']'인데 스택의 머리에 '('이 있는 경우)도 잘못된 경우로 체크하여 조건문을 수정했습니다. 

또, 다른 문제점은 while문 안에도 있었습니다. 

먼저 exp에 문자열을 입력받은 후에 if문을 통해 탈출 조건에 부합하는지 확인을 해야 하는데, if문을 먼저 작성하고 exp에 문자열을 입력받도록 코드를 작성했습니다. 그래서 계속 "."을 입력해도 yes가 출력되었습니다... 

처음에 왜 이렇게 작성했을까요.... 여하튼 문제점들을 찾아서 위와 같이 해결했습니다!

 

 

감사합니다!

2022.02.06