다음으로 푼 문제가 쇠막대기 문제이다.
레이저만 개수를 세어 주는 것이 아니라 막대기가 레이저에 의해서 나누어지는 것을 주의깊게 보아야 한다.
특히, 이번 문제는 조금 관점을 다르게 보면 쉽게 풀 수 있던 문제였다.
반복문을 돌면서 레이저를 만나는 경우에는 현재 레이저가 있는 층의 number만큼 막대가 분할되고, 층이 끝난다면 1만 추가해주면 되는 아이디어였다!
import sys
input = sys.stdin.readline # 시간 초과 error를 해결하기 위한 input함수 재정의
sticks = input().strip() # 문장을 입력받는다.
laser_stack = [] # 층또는 레이저가 쌓일 list
answer = 0 # 정답은 0부터 시작
for idx in range(len(sticks)):
if sticks[idx] == '(': # 층 또는 레이저가 시작될 경우
laser_stack.append('(') # stack에 추가
else: # 층이 끝나거나 레이저가 끝난 경우
laser_stack.pop() # 층 끝남 및 레이저만 존재한 경우 레이저 제거
if sticks[idx-1] == '(': # 즉, 레이저인 경우
answer += len(laser_stack) # 레이저가 한 번 발사 될 때 마다 해당 층부터 아래 층까지 조각남
else: # 레이저가 아닌 층이 끝난 경우
answer += 1 # 레이저 두 번이면 쇠 막대기 하나는 세 개로 쪼개지기 때문
print(answer) # 정답 출력
사실 아이디어가 생각나지 않아서 다른 블로그에 올라온 내용을 참고했다.
참고한 블로그 : https://inuplace.tistory.com/844
else문에서 laser_stack.pop()을 먼저 실행한 이유는 레이저든 아니든 pop을 실행해주어야 했기 때문이다.
'Algorithm Test > BaekJoon' 카테고리의 다른 글
BaekJoon 14225 - 부분수열의 합 (Python) (0) | 2022.03.06 |
---|---|
BaekJoon 9613 - GCD 합 (Python) (0) | 2022.03.06 |
BaekJoon 17413 - 단어 뒤집기 2 (Python) (0) | 2022.03.03 |
BaekJoon 10866 - 덱 (Python) (0) | 2022.03.02 |
BaekJoon 1158 - 요세푸스 문제 (Python) (0) | 2022.03.01 |