목차

Fraction

ps
링크acmicpc.net/…
출처BOJ
문제 번호30855
문제명Fraction
레벨실버 1
분류

파싱

시간복잡도O(n)
인풋사이즈n<=100
사용한 언어Python 3.11
제출기록39512KB / 136ms
최고기록40ms
해결날짜2023/11/29

풀이

'괄호끼리 매칭이 안되는 경우'와 '( 와 ) 사이에 항이 세 개가 아닌 경우', '시작이나 끝에 괄호 대신 숫자가 있는 경우' 뿐이라는 것을 알 수 있다. 스택에 '(' 를 같이 넣어주어서, ')'를 처리할때 괄호 매칭과 괄호사이의 항이 3개인지 체크해주고, 문자열을 모두 처리한 뒤에 스택에 숫자 한개만 남게 되는지만 확인해주면 된다. n>2 이상이기 때문에, 숫자 하나만 들어오는 입력을 따로 체크해줄 필요는 없다.

코드

"""Solution code for "BOJ 30855. Fraction".

- Problem link: https://www.acmicpc.net/problem/30855
- Solution link: http://www.teferi.net/ps/problems/boj/30855

Tags: [parsing]
"""

import fractions


def main():
    n = int(input())  # pylint: disable=unused-variable
    symbols = input().split()

    stack = []
    for s in symbols:
        if s == ')':
            if len(stack) < 4 or stack[-4] != '(' or '(' in stack[-3:]:
                print('-1')
                return
            a, b, c = stack[-3:]
            stack[-4:] = [a + b / c]
        elif s == '(':
            stack.append(s)
        else:
            stack.append(fractions.Fraction(s))
    if len(stack) != 1 or stack[0] == '(':
        print('-1')
        return

    answer = stack[0]
    print(answer.numerator, answer.denominator)


if __name__ == '__main__':
    main()