코딩테스트/SWExpertAcademy

Forth Python(SW Expert Academy)

멍토 2020. 3. 9.

난이도 : D2

문제번호 : 4874

※ 저의 풀이가 무조건적인 정답은 아닙니다.

다른 코드가 좀더 효율적이고 좋을 수 있습니다.

다른사람들의 풀이는 언제나 참고만 하시기 바랍니다.

문제 주소 및 출처입니다.

https://swexpertacademy.com/main/learn/course/subjectDetail.do?courseId=AVuPDN86AAXw5UW6&subjectId=AWOVIc7KqfQDFAWg#

 

SW Expert Academy

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

swexpertacademy.com


목차

1. 문제 설명

2. 문제 해석

3. 소스 코드


1. 문제 설명

Forth라는 컴퓨터 언어는 스택 연산을 기반으로 하고 있어 후위 표기법을 사용한다. 예를 들어 3+4는 다음과 같이 표기한다.
 

3 4 + .
 

Forth에서는 동작은 다음과 같다.
 

숫자는 스택에 넣는다.

연산자를 만나면 스택의 숫자 두 개를 꺼내 더하고 결과를 다시 스택에 넣는다.

‘.’은 스택에서 숫자를 꺼내 출력한다.

 

Forth 코드의 연산 결과를 출력하는 프로그램을 만드시오. 만약 형식이 잘못되어 연산이 불가능한 경우 ‘error’를 출력한다.
 

다음은 Forth 연산의 예이다.

입력

첫 줄에 테스트 케이스 개수 T가 주어진다.  1T50
 

다음 줄부터 테스트 케이스의 별로 정수와 연산자가 256자 이내의 연산코드가 주어진다. 피연산자와 연산자는 여백으로 구분되어 있으며, 코드는 ‘.’로 끝난다.

나눗셈의 경우 항상 나누어 떨어진다.

출력

#과 1번부터인 테스트케이스 번호, 빈칸에 이어 계산결과를 정수로 출력하거나 또는 ‘error’를 출력한다.

예시

입력 출력
3
10 2 + 3 4 + * .
5 3 * + .
1 5 8 10 3 4 + + 3 + * 2 + + + .
#1 84
#2 error
#3 168

2. 문제풀이

파이썬 스택 2일차 연습문제 중 하나인 Forth 문제이다.

후위연산은 컴공과 자료구조를 들으면서 구현해봤었다.

숫자라면 스택에 값을 넣게되고

부호라면 스택에 있는 값을 2개를 꺼내어 계산을 하고 다시 스택에 넣어준다.

마지막 스택에 남은 값이 결과 값이된다.


3. 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#D2 4874 Forth
= int(input())
 
def cal(t1, t, t2):
    t1 = int(t1)
    t2 = int(t2)
    if t == '+':
        return t1 + t2
    elif t == '-':
        return t1 - t2
    elif t == '*':
        return t1 * t2
    elif t == '/':
        return t1 // t2
 
for a in range(1, T+1):
    stack_result = input().split()
    stack_result.pop()
    stack_operater = []
    #후위연산 스택을 순회하면서 확인
    for t in stack_result:
        #숫자라면 임시저장
        if '0' <= t <= '9':
            stack_operater.append(t)
        else:
            if len(stack_operater) < 2:
                print('#{} error'.format(a))
                break
            #연산자면 2개를 꺼내서 계산한다.
            t2 = stack_operater.pop()
            t1 = stack_operater.pop()
            stack_operater.append(cal(t1, t, t2))
    else:
        #결과값 출력
        if len(stack_operater) != 1:
            print('#{} error'.format(a))
            continue
        print('#{} {}'.format(a, stack_operater[0]))

댓글

💲 광고입니다.