https://www.acmicpc.net/problem/1935
문제
접근법
생각해야할 건 크게 2가지였다.
첫째, 후위표기식을 어떻게 계산할지
둘째, 알파벳에 숫자들을 어떻게 넣을지
첫째를 해결하기 위해 하나하나 과정을 적어보았고, 이들의 공통점을 묶어 나열해 보았다.
'연산자일 때 코드를 어떻게 구성할까'가 가장 큰 고민이었는데, 연산자로 연산된 결과도 스택에 집어넣음으로 해결할 수 있음을 깨닫게 되면서 첫째 고민이 해결되었다.
이제 둘째를 해결해야했는데, 숫자를 각 알파벳에 맞게 어떻게 하면 여러 번 for문을 안 돌리고 한 방에 해결할 수 있음에 대해 고민을 하게 되었다.
고민 결과, 아스키 코드를 떠올렸고 문제에서 알파벳 순서에 맞게 숫자들을 제공해준다 하였으니 그걸 이용해야겠다는 생각이 들었다.
[주요 변수]
expression (list) : 후위연산식
num (list) : 알파벳 순서에 맞게 제공된 값들
stk (list) : 연산해야하는 숫자들 모음
[과정]
1. 후위연산식이 들어있는 expression 앞에서부터 읽기
2. 만약 알파벳일 경우,해당 알파벳을 아스키 코드로 바꾸어 65를 뺀 값을 인덱스로 하는 num을 stk에 append
(이유 : 'A'의 아스키 코드 값이 65이기 때문)
3. 만약 연산자일 경우, stk에서 두 번 pop
4. 후위연산자이기 때문에 먼저 pop되는 숫자가 연산의 뒤에 있어야 함을 주의하여 나온 2숫자를 연산자에 맞게 연산
5. 연산이 끝난 결과는 다시 계산을 위해 stk에 append
6. 1~5번을 반복
7. 계산 결과를 소숫점 둘째 자리까지 출력
코드
N=int(input())
expression=list(input())
num=[int(input()) for i in range(N)]
stk=[]
for i in expression:
if i.isalpha():
stk.append(num[ord(i)-65])
else:
a=stk.pop()
result=stk.pop()
if i=='+':
result+=a
elif i=='-':
result-=a
elif i=='*':
result*=a
elif i=='/':
result/=a
stk.append(result)
print('%.2f' %stk[-1])
'코딩테스트 준비 > 백준' 카테고리의 다른 글
[백준] 10808번 알파벳 개수 - 파이썬(Python) (0) | 2021.07.31 |
---|---|
[백준] 1918번 후위 표기식 - 파이썬(Python) (0) | 2021.07.31 |
[백준] 17299번 오등큰수 - 파이썬(Python) (0) | 2021.07.28 |
[백준] 17298번 오큰수 - 파이썬(Python) (1) | 2021.07.28 |
[백준] 10799번 쇠막대기 - Python(파이썬) (0) | 2021.07.26 |