백준 10799 쇠막대기 Python

Derhon·2023년 11월 15일
0
post-thumbnail

백준 10799 쇠막대기

나의 답

line = input()

stack = []
res = 0
prev = ""

for el in line:
    if el == ")":
        if prev == "(":  # 레이저인 경우
            stack.pop()
            res += len(stack)
        elif prev == ")":  # 막대기의 끝점인 경우
            res += 1
            stack.remove("(")
    else:
        stack.append(el)
    prev = el

print(res)

생각

괄호가 담기는 스택 하나를 두고, 경우의 수를 나눴다.

  1. 현재 검사하는 괄호가 닫는 괄호인 경우
    a. 직전에 검사한 괄호가 여는 괄호였던 경우
    : 레이저이므로, 스택에 담긴 여는 괄호들(끝나지않은 막대기들)의 수를 더해준다. 그리고 레이저 시작점(여는 괄호)를 지운다.
    b. 직전에 검사한 괄호가 닫는 괄호였던 경우
    : 막대기가 끝나는 점이므로, 해당 막대기의 잔바리, 즉 1개를 더해준다.
  2. 현재 검사하는 괄호가 여는 괄호인 경우
    : 막대기의 시작점이므로, 그냥 담는다.

공통으로 직전에 검사하는 prev를 두고 검사한다.

나은 답

bar_razor = list(input())
answer = 0
stack = []

for i in range(len(bar_razor)):
    if bar_razor[i] == '(': #스택 쌓기
        stack.append('(')
        
    else:
        if bar_razor[i-1] == '(': #()라면 (를 pop하고 현재 스택에 들어있는 ( 수만큼 값을 더해준다.
            stack.pop()
            answer += len(stack)
            
        else:
            stack.pop() 
            answer += 1 #끄트머리 막대기 부분을 더해준다

print(answer)

애초에 prev를 두고 검사할 필요가 없었다.
그냥 포문을 인덱스로 돌리고, 직전 요소와 검사하면 되는거였다.

profile
🧑‍🚀 이사했어요 ⮕ https://99uulog.tistory.com/

0개의 댓글