728x90
반응형
SW Expert Academy에서 학습용으로 문제를 가져왔습니다. 문제가 될 시 수정, 삭제하겠습니다.
https://swexpertacademy.com/main/main.do
문제 :
Forth라는 컴퓨터 언어는 스택 연산을 기반으로 하고 있어 후위 표기법을 사용한다. 예를 들어 3+4는 다음과 같이 표기한다.
3 4 + .
Forth에서는 동작은 다음과 같다.
숫자는 스택에 넣는다.
연산자를 만나면 스택의 숫자 두 개를 꺼내 더하고 결과를 다시 스택에 넣는다.
‘.’은 스택에서 숫자를 꺼내 출력한다.
Forth 코드의 연산 결과를 출력하는 프로그램을 만드시오. 만약 형식이 잘못되어 연산이 불가능한 경우 ‘error’를 출력한다.
다음은 Forth 연산의 예이다.
[입력]
첫 줄에 테스트 케이스 개수 T가 주어진다. 1≤T≤50
다음 줄부터 테스트 케이스의 별로 정수와 연산자가 256자 이내의 연산코드가 주어진다. 피연산자와 연산자는 여백으로 구분되어 있으며, 코드는 ‘.’로 끝난다.
나눗셈의 경우 항상 나누어 떨어진다.
[출력]
#과 1번부터인 테스트케이스 번호, 빈칸에 이어 계산결과를 정수로 출력하거나 또는 ‘error’를 출력한다.
input
3
10 2 + 3 4 + * .
5 3 * + .
1 5 8 10 3 4 + + 3 + * 2 + + + .
output
#1 84
#2 error
#3 168
code
Test_case = int(input())
for t in range(1, Test_case+1):
cal = input().split()
stack = []
operators = {
'+': lambda x, y: x + y,
'-': lambda x, y: x - y,
'*': lambda x, y: x * y,
'/': lambda x, y: x // y, #기호에 대한 연산자를 만들어둔다.
}
for i in cal: #입력받은 식을 돌려서
if i == '.': #만약 '.'가 나왔을때
if len(stack) > 1: #stack이 비어있지 않을때
result = "error" #error를 도출하고
else:
result = int(stack.pop()) #stack이 비어있지 않으면 정수로 변환 후 pop한것을 결과로 받는다.
elif i in operators.keys(): #'.'가 나오지 않고 연산자가 ex)'+'.'-' 부분들이 나왔을 때
if len(stack) < 2: #만약 stack이 계산할 수 없는 상황일때
result = "error" #error를 도출
break
else:
a = int(stack.pop()) #a는 pop한 정수
b = int(stack.pop()) #b는 pop한 정수
c = operators[i](int(b), int(a)) #연산자의 i번째를 계산
stack.append(int(c)) #정수로 변환후 stack에 추가
else :
stack.append(i)
print("#{} {}".format(t, result))
반응형
'Programming > SWEA' 카테고리의 다른 글
[SWEA 4873].[파이썬 S/W 문제해결 기본] 4일차 - 반복문자 지우기 (0) | 2021.08.04 |
---|---|
[SWEA 4871].[파이썬 S/W 문제해결 기본] 4일차 - 그래프 경로 (0) | 2021.08.04 |
[SWEA 4866].[파이썬 S/W 문제해결 기본] 4일차 - 괄호검사 (0) | 2021.08.04 |
[SWEA 4869].[파이썬 S/W 문제해결 기본] 4일차 - 종이붙이기 (0) | 2021.08.03 |
[SWEA 4865].[파이썬 S/W 문제해결 기본] 3일차 - 글자수 (0) | 2021.08.03 |