본문 바로가기
Algorithm/Python

[Python] 백준 - 10799번 쇠막대기(Stack)

by 힘팽 2022. 3. 3.

◈ 오류 정정 및 피드백 환영

 

10799번: 쇠막대기

여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저

www.acmicpc.net


🔎문제 분석

레이저와 막대를 구분하는 방법은 닫는 괄호의 유무이기 때문에 여는 괄호만으로는 판단이 어렵다. 따라서 괄호가 나와도 우선 다른 곳에 저장했다가 다음 시점에서 꺼내서 확인해야 한다. 즉, 스택(Stack)으로 접근하면 된다.

 

핵심은 레이저에 의해 잘리는 조각의 개수이다. 만약 3개의 막대기가 있는 상황에서 레이저를 만나면 6개가 된다. 닫는 괄호가 나왔을 때 이전 괄호가 여는 괄호라면 즉, 레이저임이 확인된다면 최종 개수에 막대기 개수만큼 더해주면 된다. 

if i == ")":
    if stack[-1] == "(":
        cnt += rod

 

 

 

만약 이전 괄호가 닫는 괄호라면 막대기가 끝났음을 의미하므로 최종 개수에 하나를 더해준 뒤에 현재 막대기 개수를 하나 줄여주면 된다.

elif stack[-1] == ")":
    cnt += 1
    rod -= 1

 

여는 괄호가 나왔을 때 이전 괄호가 여는 괄호라면 새로운 막대기가 추가될 경우를 의미한다.

elif i == "(":
    if stack[-1] == "(":
        rod += 1

import sys
input = sys.stdin.readline

a = list(input())
stack = [a[0]]
cnt = 0
rod = 0
for i in a[1:]:
    if i == ")":
        if stack[-1] == "(":
            cnt += rod
        elif stack[-1] == ")":
            cnt += 1
            rod -= 1
    elif i == "(":
        if stack[-1] == "(":
            rod += 1
    stack.append(i)
print(cnt)

댓글