[SWEA] 4874 forth
문제 출처 : [SWEA] 4874 forth
learn -> course -> programming intermediate -> stack2 -> forth
문제
Forth라는 컴퓨터 언어는 스택 연산을 기반으로 하고 있어 후위 표기법을 사용한다. 예를 들어 3+4는 다음과 같이 표기한다.
3 4 + .
Forth에서는 동작은 다음과 같다.
숫자는 스택에 넣는다.
연산자를 만나면 스택의 숫자 두 개를 꺼내 더하고 결과를 다시 스택에 넣는다.
‘.’은 스택에서 숫자를 꺼내 출력한다.
Forth 코드의 연산 결과를 출력하는 프로그램을 만드시오. 만약 형식이 잘못되어 연산이 불가능한 경우 ‘error’를 출력한다.
입력
첫 줄에 테스트 케이스 개수 T가 주어진다. 1≤T≤50
다음 줄부터 테스트 케이스의 별로 정수와 연산자가 256자 이내의 연산코드가 주어진다. 피연산자와 연산자는 여백으로 구분되어 있으며, 코드는 ‘.’로 끝난다.
나눗셈의 경우 항상 나누어 떨어진다.
출력
#과 1번부터인 테스트케이스 번호, 빈칸에 이어 계산결과를 정수로 출력하거나 또는 ‘error’를 출력한다.
코드
# 후위표기식 계산 함수
def forth(lst):
stack = [] # 계산 결과를 담을 리스트 초기화
# 후위표기식을 순회하면서 계산
for i in range(len(lst)):
if lst[i] == '.': # i가 '.'일 때 스택의 길이가 1이면 스택의 값을 return 해줌
if len(stack) == 1:
return stack.pop()
else: # 그렇지 않을 경우 올바른 식이 아니므로 return error
return 'error'
# stack에 숫자가 2개 미만으로 있는 경우 lst[i]가 연산자이면 error 숫자면 append
elif len(stack) < 2:
if lst[i] == '+' or lst[i] == '-' or lst[i] == '*' or lst[i] == '/':
return 'error'
else:
stack.append(int(lst[i]))
else:
# 연산자 별로 숫자 2개를 pop해서 계산 후 다시 append
if lst[i] == '+':
b = stack.pop()
a = stack.pop()
stack.append(a + b)
elif lst[i] == '-':
b = stack.pop()
a = stack.pop()
stack.append(a - b)
elif lst[i] == '*':
b = stack.pop()
a = stack.pop()
stack.append(a * b)
elif lst[i] == '/':
b = stack.pop()
a = stack.pop()
stack.append(a // b)
else: # 연산자가 아닐 경우 숫자, int로 변환해서 넣어줌
stack.append(int(lst[i]))
T = int(input())
for tc in range(1, T + 1):
calc_list = list(input().split()) # 계산할 수식을 리스트로 받아옴
print(f'#{tc} {forth(calc_list)}')
풀이 방법
후위표기식을 계산하는 함수를 만들어서 풀이하였다. 우선 종료조건을 작성해주었고 그 다음으로는 오류가 발생하는 조건을 적어주었다. 마지막 else 문에서는 연산자를 확인하여 연산결과를 다시 stack에 append해주었다.
Author And Source
이 문제에 관하여([SWEA] 4874 forth), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yujin19/SWEA-4874-forth저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)