관리 메뉴

커리까지

[백준] 4889번 안정적인 문자열 파이썬 본문

알고리즘/풀이

[백준] 4889번 안정적인 문자열 파이썬

목표는 커리 2021. 4. 29. 21:30
728x90
SMALL

문제

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

  1. 빈 문자열은 안정적이다.
  2. S가 안정적이라면, {S}도 안정적인 문자열이다.
  3. S와 T가 안정적이라면, ST(두 문자열의 연결)도 안정적이다.

{}, {}{}, {{}{}}는 안정적인 문자열이지만, }{, {{}{, {}{는 안정적인 문자열이 아니다.

문자열에 행할 수 있는 연산은 여는 괄호를 닫는 괄호로 바꾸거나, 닫는 괄호를 여는 괄호로 바꾸는 것 2가지이다.

입력

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

입력의 마지막 줄은 '-'가 한 개 이상 주어진다.

출력

각 테스트 케이스에 대해서, 테스트 케이스 번호와 입력으로 주어진 문자열을 안정적으로 바꾸는데 필요한 최소 연산의 수를 출력한다.

예제 입력 1

}{
{}{}{}
{{{}
---

예제 출력 1

1. 2
2. 0
3. 1

제출답안

def count(text, cnt):
    cnt += 1
    c = 0
    while text.find("{}") >= 0:
        text = text.replace("{}", "")
    c += text.count("{{")
    text = text.replace("{{", "")
    c += text.count("}}")
    text = text.replace("}}", "")
    c += text.count("}{") * 2
    print(f"{cnt}. {c}")
    return cnt

cnt = 0
while True:
    text = input()
    if text.find('-') >= 0:
        break
    cnt = count(text, cnt)
  1. while를 돌면서 안정적인 문자열이면 해당 문자열을 공백으로 바꾼다.
  2. 그다음에 {{면 해당 {{의 개수를 찾아서 c에 누적한다.
    1. 그리고 해당 문자를 공백으로 바꾼다.
  3. 마찬가지로 }}도 위와 같은 방법을 쓴다.
  4. }{는 두번 돌려야 하기 때문에 카운트에 2를 곱해서 누적한다.
  5. 마지막으로 해당 문자열의 순서와 누적합을 출력한다.
  6. 함수에서는 cnt를 계속 받아야 하기 때문에 return을 해서 cnt를 1씩 늘려간다.
  7. 그리고 밑에 while문에 --가 나오면 반복문을 빠져나간다.
728x90
LIST
Comments