algorithm/baekjoon

[백준] 10799 쇠막대기(파이썬)

support_u 2023. 3. 7. 09:03

문제

 

10799번: 쇠막대기

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

www.acmicpc.net

코드

replace

import sys
input = sys.stdin.readline

stick = input().strip()

stick=stick.replace("()", "0")

open = 0
st_c = 0

for i in stick:
    if i == "0":
        st_c += open
    elif i == "(":
        open += 1
    elif i == ")":
        open -= 1
        st_c += 1

print(st_c)

stack

import sys
input = sys.stdin.readline

stick = list(input().strip())

cut = 0
total = []
st_c = 0

for i in range(len(stick)):
    if stick[i] == "(":
        total.append(stick[i])
    else:
        if stick[i-1] == "(":
            total.pop()
            if total:
                st_c += len(total)
        else:
            total.pop()
            st_c += 1

해설

일단 주위점은 끝날때 막대를 어디서 세는지이다. 풀이처럼 지울때가 아닌 st_c에 집어 넣을 때 세버리면 예시 1번에서 18이 나오게 된다.

두 풀이 방법은 비슷한데, 차이가 있다면 replace로 ()를 없애고 갔는지, ()를 직접 세었는지이다.

커팅 전에 가로를 세어주고 커팅 할때마다 st_c에 추가해주는 풀이를 했다.

이 방법이 생각이 안나서 오랫동안 고민했다. 생각해보면 간단한데 돌아가고 있었던 것 같다 다음에 다시 풀어봐야겠다.