본문 바로가기
알고리즘 문제풀이/백준

[백준 4889] 안정적인 문자열

by m2162003 2020. 11. 29.

www.acmicpc.net/problem/4889

 

4889번: 안정적인 문자열

입력은 여러 개의 데이터 세트로 이루어져 있다. 각 데이터 세트는 한 줄로 이루어져 있다. 줄에는 여는 괄호와 닫는 괄호만으로 이루어진 문자열이 주어진다. 문자열의 길이가 2000을 넘는 경우

www.acmicpc.net

 

스택을 사용한다.

{는 무조건 푸쉬한다.

}의 경우 이전에 {가 있으면 팝을 한다. => 이 경우 안정적인 문자열이다.

이전에 {가 없을 경우 문제가 발생한다. ('}'을 푸쉬하는 일은 없으므로 stack은 empty인 상태일 것이다.)

이 때 }  -> {로 바꿔서 넣어주고 cnt++ 해준다.

 

문자열을 전부 돌고 난 후 스택에 남은 것은 제대로 처리되지 못한 { 일 것이다.

따라서 {을 처리하기 위해 스택 size에 반을 }로 바꾼다.

#include <stack>
#include <stdio.h>
#include <string.h>

using namespace std;
char str[2001];
int main(void)
{
  int t = 0;
  while (1)
  {
    t++;
    scanf("%s", str);
    if (str[0] == '-')
    {
      break;
    }
    int cnt = 0;
    stack<char> s;

    for (int i = 0; i < strlen(str); i++)
    {
      char c = str[i];
      if (c == '{')
      {
        s.push(c);
      }
      else if (c == '}')
      {
        if (s.empty())
        {
          cnt++;
          s.push('{');
        }
        else if (!s.empty() && s.top() == '{')
          s.pop();
      }
    }

    cnt += s.size() / 2;

    printf("%d. %d\n", t, cnt);
  }
  return 0;
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 2493] 탑  (0) 2020.11.30
[백준 6198] 옥상 정원 꾸미기  (0) 2020.11.30
[백준 5397] 키로거  (0) 2020.11.29
[백준 1406] 에디터  (0) 2020.11.29
[백준 10814] 나이순 정렬  (0) 2020.11.28

댓글