본문 바로가기
TIL - 프로그래밍/Python 알고리즘

[SWEA] 1223. 계산기2 - Python

by chaemj97 2022. 2. 23.
728x90

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14nnAaAFACFAYD 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

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

예를 들어

“3+4+5*6+7”

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

"34+56*+7+"

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

문자열 계산식을 구성하는 연산자는 +, * 두 종류이며 피연산자인 숫자는 0 ~ 9의 정수만 주어진다.


< ❓ 생각 >


< 💻 코드 >

for tc in range(1,11):
    # 테스트 케이스의 길이
    T = int(input())
    # 테스트 케이스
    TC = list(input())

    # 1. 후위 표기식으로 바꾸기
    priority = {'*':2, '+':1}
    result_ls = []
    stack = []
    for i in TC:
        # 숫자면 결과에 넣기
        if i != '*' and i != '+':
            result_ls.append(i)
        # '*' or '+'
        else:
            # 스택이 비어있으면
            if not stack:
                stack.append(i)
            # 스택이 비어있지 않으면
            else:
                # stack[-1] 보다 우선순위가 낮다면 stack에 있는 연산자 다 빼내기
                if priority[stack[-1]] >= priority[i]:
                    while stack and priority[stack[-1]] >= priority[i]:
                        result_ls.append(stack.pop())
                stack.append(i)
    # 남아있는 연산자 모두 넣기
    while stack:
        result_ls.append(stack.pop())

    # 2. 계산하기
    result = []
    i = 0
    for i in result_ls:
        if i != '*' and i != '+':
            result.append(i)
        elif i == '+':
            result[-2] = int(result[-2]) + int(result[-1])
            result.pop()
        else:
            result[-2] = int(result[-2]) * int(result[-1])
            result.pop()

    print(f'#{tc} {result[0]}')

문제 제대로 안 읽어서 후위표기식 없이 만든 코드

for tc in range(1,11):
    # 테스트 케이스의 길이
    T = int(input())
    # 테스트 케이스
    TC = list(input())

    # *는 바로 계산하고 +기다렸다 마지막에 계산
    stack = []
    i = 0
    while i < T:
        # 숫자와 '+'를 stack에 넣기
        if TC[i] != '*':
            # '+'일때 stack안에 이미 '+' 있으면 이전 '+' 계산
            if len(stack) > 1 and stack[-2] == '+':
                stack[-3] = int(stack[-3]) + int(stack[-1])
                # '+'와 더한 숫자 지우기
                stack.pop()
                stack.pop()    
            stack.append(TC[i])
            i += 1
            
        # '*'면 바로 계산
        elif TC[i] == '*':
            stack[-1] = int(stack[-1]) * int(TC[i + 1])
            i += 2
            
    # 다 넣고 나면 a + b 형태로 3개가 남음
    # 마지막 연산
    result = int(stack[0]) + int(stack[2])

    print(f'#{tc} {result}')

 

728x90
반응형

댓글