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

멋진감자·2024년 12월 6일
1

알고리즘

목록 보기
29/65
post-thumbnail

문제

방금 전 푼 9012. 괄호 문제에서 나아가, 대괄호와 영어로 된 문장이 추가된 형태이다.

업로드중..

풀이

입력을 단순 cin >> string 으로 받는 게 아니라,
getline()을 사용하는 게 포인트다.
cin은 공백 문자를 만나면 입력을 받기를 멈추기 때문이다.
한 줄 쭉 입력받는 거 잊어먹어서 찾아보고, 아래 정리해뒀다.

getline()으로 받은 문자열을 돌며 괄호나 대괄호를 만나면 벡터에 넣어줬다.
이후는 9012. 괄호 문제와 같은 방식으로 풀었다.

한 줄 입력 받기

#include <cstring>

기본 사용법은 cin.getline(컨테이너, 사이즈 + 1, 구분자)이다.
아래와 같이 사용한다면 \n을 만나기 전까지 최대 100자를 받을 수 있다.

char c[101];
cin.getline(c, 101, "\n")

#include <string>

기본 사용법은 getline(cin, 컨테이너)이다.
아래와 같이 사용한다면 \n을 만나기 전까지 글자수 제한 없이 모두 받을 수 있다.

string s;
getline(cin, s)

코드

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

vector<char> v;

void isBalanced() {
	int idx = 0;
	while (idx < v.size() - 1 && !v.empty()) {
		if (v[idx] == '(' && v[idx + 1] == ')') {
			v.erase(v.begin() + idx);
			v.erase(v.begin() + idx);
			idx = 0;
		}
		else if (v[idx] == '[' && v[idx + 1] == ']') {
			v.erase(v.begin() + idx);
			v.erase(v.begin() + idx);
			idx = 0;
		}
		else idx++;
	}

	if (v.empty()) cout << "yes\n";
	else cout << "no\n";

	return;
}

int main() {
	while (1) {
		string str;
		getline(cin, str);
		if (str == ".") break;

		v.clear();
		for (int i = 0; i < str.length(); i++) {
			if (str[i] == '(' || str[i] == ')' || str[i] == '[' || str[i] == ']') {
				v.push_back(str[i]);
			}
		}
		if (v.empty()) cout << "yes\n";
		else isBalanced();
	}

	return 0;
}

채점

Reference

[C++] 문자열 입력

profile
난멋져

0개의 댓글