[SWEA]계산기 가만안둬[PYTHON]
문자열로 이루어진 계산식이 주어질 때, 이 계산식을 후위 표기식으로 바꾸어 계산하는 프로그램을 작성하시오.
예를 들어
“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()))
이렇게 보니 굉장히 길다
사실 내가 말이 많은 것이다
다시 짜라면 짤 수 있겠니?
그건 또 모를 일이다
껄껄
Author And Source
이 문제에 관하여([SWEA]계산기 가만안둬[PYTHON]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sin5015243/SWEA계산기-가만안둬PYTHON저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)