백준 10799

justhaza.log·2023년 7월 29일

알고리즘: BOJ

목록 보기
8/125

문제

https://www.acmicpc.net/problem/10799

코드

import sys

str = sys.stdin.readline().rstrip()
stack = []
ans = 0

for i in range(len(str)):
    if str[i] == "(":
        stack.append("(")
    elif str[i] == ")":
        if str[i - 1] == "(":
            stack.pop()
            ans += len(stack)
        else:
            stack.pop()
            ans += 1

    # print("i = ", i)
    # print("ans = ", ans)

print(ans)

처음에 괄호의 짝을 확인해야 한다고 생각했고, 문제를 어렵게 받아들였다.

근데 입력 자체가 괄호의 짝이 맞게 주어지기 때문에 이 부분은 고려할 필요가 없다.

그렇다면 레이저가 나타났을 때, 그 레이저로 인해 생기는 쇠막대기는 몇 개인지 어떻게 알 수 있을까?

'((('처럼 여는 괄호가 연속으로 나오면, 이는 쇠막대기가 3개 있음을 의미한다.
그리고 '(' 바로 다음에 ')'가 나오면 이는 레이저가 된다.
그래서 '((()'는 쇠막대기 2개가 존재하는 상황에서 레이저가 하나 나온 상황이다.
따라서 '()'에 의해 앞의 '(('에서 2개의 쇠막대기가 생성된다.

기타

생각보다 Stack이라는 자료 구조를 의식하면서 문제를 풀 필요가 있는 것 같다.

profile
알고리즘이나 SQL 문제 풀이를 올리고 있습니다. 피드백 환영합니다!

0개의 댓글