728x90
반응형
풀기 전 생각해보기😮
- stack 구조를 이용
풀이🛫
다른 분의 풀이를 참고했다
inp = list(input())
stack = [] # 스택 저장 공간
res = ""
# inp 값의 요소 확인
for i in inp:
if i.isalpha(): # i.isalpha(): 만약 i가 영문자라면 True
res += i # res에 문자 입력
elif i == '(': # 여는 괄호: stack에 담는다
stack.append(i)
elif i == '*' or i == '/': # 곱셈 또는 나눗셈
# stack의 꼭대기 연산자가 같은 우선순위의 연산자일 경우
while stack and (stack[-1] == '*' or stack[-1] == '/'):
res += stack.pop() # res에 모든 연산자를 입력하고
stack.append(i) # stack에 현재 연산자 입력
elif i == '+' or i == '-': # 덧셈 또는 뺄셈
# stack의 꼭대기 연산자가 여는괄호가 아닌 동안
while stack and stack[-1] != '(':
res += stack.pop() # res에 모든 연산자를 입력
stack.append(i) # stack에 현재 연산자 입력
elif i == ')': # 닫는 괄호일 때
while stack and stack[-1] != '(': # 여는 괄호가 나올 때 까지
res += stack.pop() # 연산자를 빼서 res에 입력
stack.pop() # 여는 괄호까지 제거
while stack: # stack에 남은 값들에 대해서
res += stack.pop() # stack의 위에 쌓인 연산자부터 res에 입력
print(res)
핵심 정리🎁
- for 문의 i값이 연산자일 경우 조건에 맞게 while문과 pop()을 진행한다
링크💎
https://www.acmicpc.net/problem/1918
후기 😎
어려웠던 점
- 얼추 비슷하게 실행하는데 성공했지만, 괄호에 대한 처리가 완벽하지 못해서 제한 시간 내에 풀지 못했다
- for문으로 연산자를 확인했을 때 곧바로 처리해야 한다는 생각에 틀에 갇혀있었던 것 같다.
특정 연산자를 만났을 때 res에 올바른 값이 모두 기입된 채로 넘어가야 하는 것은 아니였다.
현재 바라보고 있는 연산자를 당장 처리해야하지 않는다면 stack에 쌓아두고,
다음 연산자를 탐색했을 때 이전의 값을 가지고, res에 추가할지 여부를 따져도 늦지 않는다는 점을 배울 수 있었다
'Algorithm Study > Python' 카테고리의 다른 글
[백준 파이썬] #1987. 알파벳 (0) | 2022.12.16 |
---|---|
[백준 파이썬] #16236. 아기상어 (0) | 2022.12.14 |
[백준 파이썬] #17298. 오큰수 (0) | 2022.12.12 |
[백준 파이썬] #14502. 연구소 (0) | 2022.12.11 |
[백준 파이썬] #1406. 에디터 (0) | 2022.12.10 |