다음으로 푼 문제가 쇠막대기 문제이다.

 

레이저만 개수를 세어 주는 것이 아니라 막대기가 레이저에 의해서 나누어지는 것을 주의깊게 보아야 한다.

 

특히, 이번 문제는 조금 관점을 다르게 보면 쉽게 풀 수 있던 문제였다.

 

반복문을 돌면서 레이저를 만나는 경우에는 현재 레이저가 있는 층의 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을 실행해주어야 했기 때문이다.

+ Recent posts