본문 바로가기

백준

백준4889 - 안정적인 문자열

https://www.acmicpc.net/problem/4889

 

4889번: 안정적인 문자열

문제 여는 괄호와 닫는 괄호만으로 이루어진 문자열이 주어진다. 여기서 안정적인 문자열을 만들기 위한 최소 연산의 수를 구하려고 한다. 안정적인 문자열의 정의란 다음과 같다. 빈 문자열은 안정적이다. S가 안정적이라면, {S}도 안정적인 문자열이다. S와 T가 안정적이라면, ST(두 문자열의 연결)도 안정적이다. {}, {}{}, {{}{}}는 안정적인 문자열이지만, }{, {{}{, {}{는 안정적인 문자열이 아니다. 문자열에 행할 수 있는 연산은 여는

www.acmicpc.net

스택 문제다. 우선 스택이 비어있을 때 '}'를 만나면 '{'로 바꿔주는 연산을 한다. 두번째로 주어진 문자열의 모든 문자를 순회한 결과 스택에 '{'가 남아있는 갯수를 세어 반으로 나눈다. 그러면 '{'를 지우기 위해 필요한 '}'의 갯수가 나온다.

 

ex1.) {{}{}{

{

{{

{

{{

{

{{

결과 : {{ -> {} 1번 바꾼다.

 

 

ex2.) }}{{}{}{

} -> { ->1번 바꾼다.

 

{

{{

{

{{

{

{{

결과 : {{ -> {} 2번 바꾼다.

 

 

ex3.) {{}{{{{}{{

{

{{

{

{{

{{{

{{{{

{{{{{

{{{{

{{{{{

{{{{{{

결과 : {{{{{{ -> {{{}}} 3번 바꾼다.

 

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

int main() {
	for(int i = 1; 1; i++) { //무한루프 돌리기
		string s; //주어진 문자열
		int cnt = 0; //총 연산횟수
		stack<char> stk; //문자열의 문자를 넣는 스택
		cin >> s;
		if (s[0] == '-') { //-를 만나면
			break; //턀출
		}
		for (unsigned int i = 0; i < s.size(); i++) { //문자열의 모든 문자를 탐색
			if (stk.size() == 0 && s[i] == '}') { //스택이 비어있는 상태에서 }를 만나면
				cnt++; //갯수를 늘리고
				s[i] == '{'; //}를 {로 바꾸고
				stk.push(s[i]); //스택에 넣는다.
			}
			else if (stk.size() != 0 && s[i] == '}') { //스택에 비어있지 않고 }를 만나면
				stk.pop(); //스택에서 팝
			}
			else { //{가 있으면
				stk.push(s[i]); //스택에 넣는다.
			}
		}
		cnt = cnt + stk.size() / 2; //남아있는 스택 크기에 반을 현재 cnt결과에 더한다.
		cout << i << ". " << cnt << '\n';
	}
}

'백준' 카테고리의 다른 글

백준5566 - 주사위 게임  (0) 2019.07.31
백준17214 - 다항 함수의 적분  (0) 2019.07.30
백준1699 - 제곱수의 합  (0) 2019.07.28
백준2606 - 바이러스  (0) 2019.07.28
백준15739 - 매직스퀘어  (0) 2019.07.26