https://www.acmicpc.net/problem/10799
10799번: 쇠막대기
여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저
www.acmicpc.net
s = input()
a = s.replace("()", "*")
stack = []
pieces = 0
for c in a:
if c == "(":
stack.append(1)
elif c == "*":
pieces += len(stack)
else:
pieces += stack.pop()
print(pieces)
"(" 문자는 막대의 시작점
")" 문자는 막대의 끝점
"()"는 레이저 이다.
이 위치가 막대의 시작점인지, 끝점인지, 레이저인지 알기위해선 각각 비교를 해야하는데 보시다시피
시작점, 끝점은 문자가 1개이지만 레이저는 2개이므로 레이저부분을 *로 변경했다.
막대의 시작점이 나타날 땐, 스택에 막대를 append하고
레이저로 막대기를 자를 땐 스택의 개수가 잘린 조각의 수이므로 pieces 변수에 더한다.
막대의 끝점이 나타날 땐, 스택에 막대를 pop한다.
막대기의 마지막 부분이므로 그것 또한 조각에 포함되니까 pieces 변수에 1를 추가해줘야 한다.
어차피 pop을 하는거 계산을 덜 하기 위해서 나는 애초에 스택에 값을 1을 주었고 pop한 값을 pieces에 추가했다.
'알고리즘 > 백준-파이썬' 카테고리의 다른 글
[백준] 17299번 (python 파이썬) (0) | 2022.04.07 |
---|---|
[백준] 17298번 (python 파이선) (0) | 2022.04.06 |
[백준] 17413번 (python 파이썬) (0) | 2022.04.06 |
[백준] 10866번 (python 파이썬) (0) | 2022.04.06 |
[백준] 1158번 (python 파이썬) (0) | 2022.04.05 |