이러한 레이저와 쇠막대기의 배치는 다음과 같이 괄호를 이용하여 왼쪽부터 순서대로 표현할 수 있다.
레이저는 여는 괄호와 닫는 괄호의 인접한 쌍 ‘( ) ’ 으로 표현된다. 또한, 모든 ‘( ) ’는 반드시 레이저를 표현한다.
쇠막대기의 왼쪽 끝은 여는 괄호 ‘ ( ’ 로, 오른쪽 끝은 닫힌 괄호 ‘) ’ 로 표현된다.
위 예의 괄호 표현은 그림 위에 주어져 있다.
쇠막대기는 레이저에 의해 몇 개의 조각으로 잘려지는데, 위 예에서 가장 위에 있는 두 개의 쇠막대기는 각각 3개와 2개의 조각으로 잘려지고, 이와 같은 방식으로 주어진 쇠막대기들은 총 17개의 조각으로 잘려진다.
쇠막대기와 레이저의 배치를 나타내는 괄호 표현이 주어졌을 때, 잘려진 쇠막대기 조각의 총 개수를 구하는 프로그램을 작성하시오.
쇠막대기 사이로 레이저가 지나갈때 총 쇠막대기의 갯수 구하기
레이저가 쇠막대기를 지나갈때 항상 쇠막대기의 갯수만큼 1씩 늘어남
레이저가 지나갈때 그 순간 쇠막대기의 갯수를 알면 풀 수 있다.
if __name__ == '__main__':
iron_input = input()
last_input = ""
truncated_iron_list = []
piece = 0
new_iron = 0
for ch in iron_input:
# 레이저일때
if last_input == "(" and ch == ")":
# 방금 전꺼는 레이저의 일부분이었으니까 삭제
truncated_iron_list.pop()
new_iron -= 1
if truncated_iron_list:
piece += len(truncated_iron_list)
if new_iron:
for i, _ in enumerate(truncated_iron_list[-new_iron:]):
if truncated_iron_list[-new_iron+i] == 0:
piece += 1
truncated_iron_list[i] = 1
new_iron = 0
# 레이저가 아니라 쇠막대기의 끝일때
elif last_input == ")" and ch == ")":
truncated_iron_list.pop()
# 쇠막대기 시작일때
else:
truncated_iron_list.append(0)
new_iron += 1
last_input = ch
print(piece)
지금 문제를 푼건 마치 세마포어처럼 문제를 풀었지만 스택을 사용하면 좀 더 쉽게 풀 수 있을것같다.