[Python] 백준 2504 - 괄호의 값 문제 풀이

Boo Sung Jun·2022년 3월 7일
0

알고리즘, SQL

목록 보기
27/70
post-thumbnail

Overview

BOJ 2504번 괄호의 값 Python 문제 풀이
분류: Data Structure (자료구조)


문제 페이지

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


풀이 코드 1

from sys import stdin


def cal(line: str) -> int:
    table = {'(': ')', '[': ']'}
    value = {'(': 2, '[': 3}
    stack = []
    res = 0
    temp = 1

    for i, bracket in enumerate(line):
        if bracket in '([':
            stack.append(bracket)
            temp *= value[bracket]
        else:
            if not stack or bracket != table[stack[-1]]:
                return 0
            if i > 0 and line[i - 1] == stack[-1]:
                res += temp
            temp //= value[stack.pop()]

    return res if not stack else 0


def main():
    line = stdin.readline().strip()
    print(cal(line))


if __name__ == "__main__":
    main()

스택을 이용한 풀이이다. 여는 괄호가 나오면 스택에 넣고, 닫는 괄호가 나오면 연산한다.temp에는 값들을 곱하고, res에는 temp 값을 더해가며 결과를 구한다.


풀이 코드 2

from sys import stdin


def cal(line: str) -> int:
    table = {'(': ')', '[': ']'}
    value = {'(': 2, '[': 3}
    stack = []
    res = 0

    for i, bracket in enumerate(line):
        if bracket in '([':
            stack.append(bracket)
        else:
            if not stack:
                return 0
            temp = 0
            while stack:
                top = stack.pop()
                if top.isdigit():
                    temp += int(top)
                elif bracket == table[top]:
                    if temp == 0:
                        stack.append(str(value[top]))
                    else:
                        stack.append(str(temp * value[top]))
                    break
                else:
                    return 0

    for i in stack:
        if i in '([':
            return 0
        else:
            res += int(i)

    return res


def main():
    line = stdin.readline().strip()
    print(cal(line))


if __name__ == "__main__":
    main()

Stack을 이용한 다른 풀이이다. 마찬가지로 여는 괄호는 스택에 넣고, 닫는 괄호가 나오면 연산한다. 이전 풀이와 달리 연산 결과도 스택에 넣으며 결과를 구한다.

0개의 댓글