여름의 서재
[SWEA] 4874_Forth 본문
728x90
📕 문제
Forth라는 컴퓨터 언어는 스택 연산을 기반으로 하고 있어 후위 표기법을 사용한다. 예를 들어 3+4는 다음과 같이 표기한다.
3 4 + .
Forth에서는 동작은 다음과 같다.
숫자는 스택에 넣는다.
연산자를 만나면 스택의 숫자 두 개를 꺼내 더하고 결과를 다시 스택에 넣는다.
‘.’은 스택에서 숫자를 꺼내 출력한다.
Forth 코드의 연산 결과를 출력하는 프로그램을 만드시오. 만약 형식이 잘못되어 연산이 불가능한 경우 ‘error’를 출력한다.
다음은 Forth 연산의 예이다.
코드 | 출력 |
4 2 / . | 2 |
4 3 - . | 1 |
[입력]
첫 줄에 테스트 케이스 개수 T가 주어진다. 1≤T≤50
다음 줄부터 테스트 케이스의 별로 정수와 연산자가 256자 이내의 연산코드가 주어진다. 피연산자와 연산자는 여백으로 구분되어 있으며, 코드는 ‘.’로 끝난다.
나눗셈의 경우 항상 나누어 떨어진다.
[출력]
#과 1번부터인 테스트케이스 번호, 빈칸에 이어 계산결과를 정수로 출력하거나 또는 ‘error’를 출력한다.
💡 풀이법
1. string을 처음부터 돌면서 숫자면 stack에 넣어줌.
2. 연산자를 만나면 stack에서 숫자 두개를 뽑아와서 연산을 해주고 다시 stack에 넣어줌.
(이때, stack의 길이가 2 이상인지 확인해줘야함 아니라면 error를 반환)
3. .을 만나면 이제 stack에 있는 남은 하나의 숫자를 반환.
(이때, stack에 있는 숫자가 한개가 아니라면 이때도 error를 반환)
def forth(string):
stack = []
for i in string:
if i == '.':
if len(stack) == 1:
return stack.pop()
else:
return 'error'
if i in ['+', '-', '*', '/']:
if len(stack) < 2:
return 'error'
a = stack.pop()
b = stack.pop()
if i == '+':
result = b + a # 여기서 순서 주의! 후에 꺼낸 숫자에서 전에 꺼낸 숫자를 연산
elif i == '-':
result = b - a
elif i == '*':
result = b * a
else:
result = int(b / a)
stack.append(result)
else:
stack.append(int(i))
T = int(input())
for tc in range(1, T + 1):
string = input().split()
print('#{} {}'.format(tc, forth(string)))
'알고리즘 > SWEA' 카테고리의 다른 글
[SWEA] 4880_토너먼트 카드게임 (DFS 이용) (0) | 2021.08.24 |
---|---|
[SWEA] 4875_미로 (DFS 이용) (0) | 2021.08.24 |
[SWEA] 1267_작업순서 (DFS 이용) (0) | 2021.08.22 |
[SWEA] 1258_행렬찾기 (0) | 2021.08.22 |
[SWEA] 6485_삼성시의 버스 노선 (0) | 2021.08.20 |
Comments