◈ 오류 정정 및 피드백 환영
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)
'Algorithm > Python' 카테고리의 다른 글
[Python] 프로그래머스 - [1차] 뉴스 클러스터링(정규식) (0) | 2022.03.05 |
---|---|
[Python] 프로그래머스 - [1차] 추석 트래픽(Greedy) (0) | 2022.03.04 |
[Python] 백준 - 1918번 후위 표기식(Stack) (0) | 2022.03.02 |
[Python] 백준 - 2805번 나무 자르기(Binary Search) (0) | 2022.03.01 |
[Python] 백준 - 2110번 공유기 설치(Binary Search) (0) | 2022.02.28 |
댓글