[SWEA]계산기 가만안둬[PYTHON]

12638 단어 SWEASWEA

문자열로 이루어진 계산식이 주어질 때, 이 계산식을 후위 표기식으로 바꾸어 계산하는 프로그램을 작성하시오.

예를 들어

“3+(4+5)*6+7”

라는 문자열로 된 계산식을 후위 표기식으로 바꾸면 다음과 같다.

"345+6*+7+"

변환된 식을 계산하면 64를 얻을 수 있다.

문자열 계산식을 구성하는 연산자는 +, * 두 종류이며 문자열 중간에 괄호가 들어갈 수 있다.

이 때 괄호의 유효성 여부는 항상 옳은 경우만 주어진다.

피연산자인 숫자는 0 ~ 9의 정수만 주어진다.

[입력]

각 테스트 케이스의 첫 번째 줄에는 테스트 케이스의 길이가 주어진다. 그 다음 줄에 바로 테스트 케이스가 주어진다.

총 10개의 테스트 케이스가 주어진다.

[출력]

#부호와 함께 테스트 케이스의 번호를 출력하고, 공백 문자 후 답을 출력한다.

진촤 계산기 진촤 4시간은 썼나 모르겠네
사실은 내가 후위표현식 이해를 잘 못했기 때문이며
while문의 조건이 그렇게나 헷갈리더라~

for tc in range(1, 11):
    N = int(input())
    TC = list(input())

    stack = []   # 연산자를 담고 계산할 것임
    num = []     # 후위표현식을 담을 것

    operator = {'(': 0, ')': 0, '-': 1, '+': 1, '*': 2, '/': 2}  # 연산자들의 우선순위를 리스트로 표현

    for i in TC:

        if i.isdigit():   # 요소가 숫자라면 num에다 추가
            num.append(i)

        elif i == '(':   # 요소가 열린 괄호라면 stack에 추가
            stack.append(i)

        elif i == ')':      # 닫힌 괄호가 나왔다면 열린 괄호가 나오기 전까지 요소들을 pop해서 후위표현식에 더해야 함
            while stack[-1] != '(':
                num.append(stack.pop())
            stack.pop()  # 열린 괄호는 pop해서 제거하기

        elif stack and operator[i] < operator[stack[-1]]:  # 연산자의 우선순위가 작다면 pop을 하다가 현재 연산자의 우선순위가 높아졌다면 멈춰!! pop하지 않음
            while stack and operator[i] < operator[stack[-1]] :  # 현재 쟤가 더 커? 멈춰  반대로 생각하려무나
                num.append(stack.pop())
            stack.append(i)  # 안에 있는 아이들을 빼주고 나 넣기

        elif stack and operator[i] == operator[stack[-1]]:  # 연산자의 우선순위가 같을 때도 고려해줘야 함. 우선순위가 같지 않을 때까지 pop하고 멈춰!
            while stack and operator[i] == operator[stack[-1]] : # 헷갈림,,, 둘이 같지 않아? 멈춰!
                num.append(stack.pop())
            stack.append(i)

        else:
            stack.append(i)   # 스택의 마지막 아이보다 연산자 우선순위가 높다면 stack에 push

    while stack:
        num.append(stack.pop())  # stack에 남아 있는 모든 아이들을 후위표현식에 마저 푸쉬

    for i in num:
        if i.isdigit():
            stack.append(i)   # 현재 stack은 비어 있으니 숫자라면 숫자를 넣어 줌.
# continue 필요없음 모든 숫자가 한 자리니까
        else:

# 가장 top은 b 그 앞에 아이는 a
            b = int(stack.pop())
            a = int(stack.pop())

            if i == '+':
                stack.append(a+b)
            elif i == '-':
                stack.append(a-b)
            elif i == '*':
                stack.append(a*b)
            elif i == '/':
                stack.append(a//b)

# 연산이 제대로 이뤄졋다면 스택에는 하나의 숫자만 남으니 그것을 pop 버블버블팝팝
    print('#{} {}'.format(tc, stack.pop()))

이렇게 보니 굉장히 길다
사실 내가 말이 많은 것이다
다시 짜라면 짤 수 있겠니?
그건 또 모를 일이다
껄껄

좋은 웹페이지 즐겨찾기