m1ndy5's coding blog

[자료구조] 백준 10799번 쇠막대기 with Python 본문

알고리즘 with python/자료구조

[자료구조] 백준 10799번 쇠막대기 with Python

정민됴 2023. 3. 22. 16:10

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

import sys

sticks = sys.stdin.readline().rstrip()

op = 0

cnt = 0

for i in range(len(sticks)-1):
    if sticks[i] == '(' and sticks[i+1] == ')':
        cnt += op

    elif sticks[i] == sticks[i+1]:
        if sticks[i] == '(':
            op += 1

        else:
            cnt += 1
            op -= 1

print(cnt)

생각한 방법은 () 레이저 발사할 때 기준으로 몇개의 괄호가 열려있는지(몇개의 막대가 있는지)를 고려했다.
(((이렇게 3개가 열려있으면 일단 한번 자르면 3조각이 생길 것이고 괄호가 닫힐 때까지는 레이저를 발사할 때마다 토막이 날것이기 때문이다.
)가 들어오게 되면 그 땐 +1을 해줘야한다. 왜냐하면 한 막대를 2번 나누면 3개가 생기므로
닫는 괄호가 들어오면 cnt += 1을해주고 열린 괄호개수(op) -= 1을 해준다.
두개씩 고려했기 때문에 () -> 레이저 (( -> 열릴 때 )) -> 닫힐 때로 고려했다. -> )(까지 고려하면 중복이 일어남