난이도 : D2
문제번호 : 4874
※ 저의 풀이가 무조건적인 정답은 아닙니다.
다른 코드가 좀더 효율적이고 좋을 수 있습니다.
다른사람들의 풀이는 언제나 참고만 하시기 바랍니다.
문제 주소 및 출처입니다.
목차
1. 문제 설명
2. 문제 해석
3. 소스 코드
1. 문제 설명
Forth라는 컴퓨터 언어는 스택 연산을 기반으로 하고 있어 후위 표기법을 사용한다. 예를 들어 3+4는 다음과 같이 표기한다. 3 4 + . Forth에서는 동작은 다음과 같다. 숫자는 스택에 넣는다. 연산자를 만나면 스택의 숫자 두 개를 꺼내 더하고 결과를 다시 스택에 넣는다. ‘.’은 스택에서 숫자를 꺼내 출력한다.
Forth 코드의 연산 결과를 출력하는 프로그램을 만드시오. 만약 형식이 잘못되어 연산이 불가능한 경우 ‘error’를 출력한다. 다음은 Forth 연산의 예이다. |
입력
첫 줄에 테스트 케이스 개수 T가 주어진다. 1≤T≤50 다음 줄부터 테스트 케이스의 별로 정수와 연산자가 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
T = 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]))
|
'코딩테스트 > SWExpertAcademy' 카테고리의 다른 글
토너먼트 카드게임 Python(SW Expert Academy) (0) | 2020.03.11 |
---|---|
미로(4875) Python(SW Expert Academy) (0) | 2020.03.10 |
반복문자 지우기 Python(SW Expert Academy) (0) | 2020.03.08 |
그래프 경로 Python(SW Expert Academy) (2) | 2020.03.07 |
종이붙이기 Python(SW Expert Academy) (0) | 2020.03.06 |
댓글