어흥

[백준 4889] 안정적인 문자열 (C++) 본문

알고리즘/백준

[백준 4889] 안정적인 문자열 (C++)

라이언납시오 2020. 8. 24. 19:03
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/4889

 

4889번: 안정적인 문자열

문제 여는 괄호와 닫는 괄호만으로 이루어진 문자열이 주어진다. 여기서 안정적인 문자열을 만들기 위한 최소 연산의 수를 구하려고 한다. 안정적인 문자열의 정의란 다음과 같다. 빈 문자열은

www.acmicpc.net

1. 주의할 점

- 전부 한번씩 뒤집어서 비교하는 일은 하지 않도록 한다(최악: 2^2000)

 

2. 구현

- 초기에 문자열을 입력받을 때, Stack에 문자를 1개씩 넣는다. 단, {}와 같이 쌍을 이룰경우, Stack에서 제외한다

- 위의 과정을 통해 안정적이지 못한 문자열이 Stack에 있을때, 가장 위에 위치한 원소 2개씩 뺀다 (문자열의 길이가 짝수이므로 가능하다)

- 원소 2개가 서로 같다면 둘중 하나만 방향을 바꾸면 되므로 Result++한다

- 원소 2개가 같지 않다면 }{ 형태이므로 원소 2개 모두 방향을 바꿔줘야 하므로 Result+=2 한다

- Result를 출력한 이후, T++를 통해 몇 번째 TC인지 확인해준다

 

#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	string str;
	int t = 1, result;
	while (1) {
		cin >> str;
		if (str[0] == '-') break;
		result = 0;
		stack<char> s;
		for (int i = 0; i < str.size(); i++) {
			char c = str[i];
			if (c == '}' && !s.empty() && s.top() == '{')
				s.pop();
			else
				s.push(c);
		}
		while (!s.empty()) {
			char c1 = s.top();
			s.pop();
			char c2 = s.top();
			s.pop();
			if (c1 == c2) result++;
			else result += 2;
		}
		cout << t << ". " << result << '\n';
		t++;
	}
	return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 16562] 친구비 (C++)  (0) 2020.08.27
[백준 1238] 파티 (C++)  (0) 2020.08.24
[백준 9466] 텀 프로젝트 (C++)  (0) 2020.08.09
[백준 14921] 용액 합성하기 (JAVA)  (0) 2020.08.07
[백준 14588] Line Friends (Small) (Java)  (0) 2020.07.28
Comments