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()