➰ 10799번 쇠막대기
💡 구현 아이디어
이 문제의 포인트는 닫는 괄호가 레이저인지 쇠막대기의 끝인지를 구분하는 것이다.
( ) 이렇게 나오면 레이저이고,
) ) 이처럼 닫는 괄호가 연속해서 나올 때 이때 두 번째 괄호는 쇠막대기의 끝이 된다.
조각은 1) 레이저에 의해 생기는 경우와 2) 쇠막대기의 끝이어서 생기는 경우 두 가지 경우로 생긴다.
1) 레이저에 의해 조각이 생기는 경우
앞에서 나온 (레이저가 아닌) 여는 괄호 '('의 수 만큼 더해준다. 이때 레이저가 아닌 여는 괄호들은 stack에 하나씩 추가해준다. 따라서 레이저가 나오면 스택의 길이(len(stack))만큼 더해준다.
2) 쇠막대기의 끝이어서 조각이 생기는 경우
닫는 괄호가 쇠막대기의 끝이라면, +1만 해주면 된다. 이때 stack 에서 요소 하나를 pop 해서 제거한다.
전체 소스 코드는 다음과 같다.
💻 소스 코드
str = input()
stack = []
ans = 0
for i in range(len(str)):
if str[i] == '(': # 여는 괄호
stack.append('(')
else: # 닫는 괄호
stack.pop()
if i > 0 and str[i-1] == '(': # 레이저인 경우
ans += len(stack)
if i > 0 and str[i-1] == ')': # 쇠막대기의 끝인 경우
ans += 1
print(ans)
'Algorithm' 카테고리의 다른 글
[백준/파이썬] 2579 계단 오르기 - 다이나믹 프로그래밍 (1) | 2023.01.25 |
---|---|
[백준/파이썬] 4889 안정적인 문자열 (자료 구조) - 스택, 덱 사용하기 (0) | 2022.10.07 |
💻[Python] 파이썬에서 자료구조 덱(deque) 사용하기 (0) | 2022.10.07 |
[백준/파이썬] 9375 패션왕 신해빈 (자료 구조) - 딕셔너리 (0) | 2022.09.28 |
[백준/파이썬] 10816 숫자 카드 2 (자료 구조) - Counter 라이브러리 (0) | 2022.09.28 |