[BOJ] 2504. 괄호의 값

2025. 7. 21. 21:16·BOJ

📌 문제 제목

문제 링크: BOJ 2504

🗒️ 문제 설명

소괄호와 대괄호만을 이용해 만들어진 괄호열이 있다.

입력이 올바르지 못한 괄호열이면 0을 출력하고, 올바른 출력이면 아래의 내용을 참고하여 출력하라.

  • '()'인 괄호열의 값은 2이다.
  • '[]'인 괄호열의 값은 3이다.
  • '(X)'인 괄호열의 값은 2 x 값(X)으로 계산된다.
  • '[X]'인 괄호열의 값은 3 x 값(X)으로 계산된다.
  • 올바른 괄호열 x와 y가 결합된 xy의 괄호값은 값(xy) = 값(x) + 값(y)으로 계산된다.

e.g. ( ( ) [ [ ] ] ) ( [ ] )의 괄호값은 28이다.

2 * (2 + (3 * 3)) + 2 * 3 = 22 + 6 = 28

 

시간 제한: 1초

메모리 제한: 128MB

1 <= ps(괄호 문자열) <= 30


💡 문제 해결 아이디어

  • 여는 괄호는 스택에 추가
  • 닫는 괄호
    • 스택의 마지막 원소가 각 괄호의 여는 괄호가 아니면 0 출력
    • 스택의 마지막 원소가 숫자라면 tmp라는 변수를 만들고 스택의 마지막 원소가 숫자가 아닐 때 까지 pop하며 tmp에 값을 더함.
      • 소괄호라면 tmp x 2, 대괄호라면 tmp x 3을 스택에 추가
  • 순회가 끝나면 스택에 남아있는 숫자들을 answer에 더함.

⌛️ 시간 복잡도

  • O(N)

✅ 최종 코드

import sys
input = sys.stdin.readline

ps = input().strip()


def solution(ps: str) -> int:
    answer = 0
    stk = []

    for b in ps:
        if b == '(' or b == '[':
            stk.append(b)
        elif b == ')':
            if not stk:
                return 0

            if stk[-1] == '(':
                stk.pop()
                stk.append(2)
            elif isinstance(stk[-1], int):
                tmp = 0
                while stk and isinstance(stk[-1], int):
                    tmp += stk.pop()
                if not stk or stk[-1] != '(':
                    return 0
                stk.pop()
                stk.append(2 * tmp)
            else:
                return 0
        elif b == ']':
            if not stk:
                return 0

            if stk[-1] == '[':
                stk.pop()
                stk.append(3)
            elif isinstance(stk[-1], int):
                tmp = 0
                while stk and isinstance(stk[-1], int):
                    tmp += stk.pop()
                if not stk or stk[-1] != '[':
                    return 0
                stk.pop()
                stk.append(3 * tmp)
            else:
                return 0

    for val in stk:
        if isinstance(val, int):
            answer += val
        else:
            return 0

    return answer


print(solution(ps))

 

'BOJ' 카테고리의 다른 글

[BOJ] 2178. 미로 탐색  (0) 2025.07.22
[BOJ] 1926. 그림  (0) 2025.07.22
[BOJ] 10799. 쇠막대기  (0) 2025.07.21
[BOJ] 9012. 괄호  (0) 2025.07.21
[BOJ] 3986. 좋은 단어  (0) 2025.07.21
'BOJ' 카테고리의 다른 글
  • [BOJ] 2178. 미로 탐색
  • [BOJ] 1926. 그림
  • [BOJ] 10799. 쇠막대기
  • [BOJ] 9012. 괄호
rubato.dev
rubato.dev
  • rubato.dev
    rubato.dev
    rubato.dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (33) N
      • BOJ (28)
      • 알고리즘 (4)
      • TIL (0)
      • Project (1) N
  • 인기 글

  • 태그

    backtracking
    Zelda
    PYTHON
    Next.js
    BOJ
    Project
    투 포인터
    DFS
    스택
    dp
    stack
    PriorityQueue
    Algorithm
    BFS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
rubato.dev
[BOJ] 2504. 괄호의 값
상단으로

티스토리툴바