728x90
난이도 : 골드2
풀이일 : 03057
https://www.acmicpc.net/problem/1918
링크로 이동하기 귀찮은 분들을 위한 문제 캡쳐
1차 시도 오답
import sys
w = sys.stdin.readline()
result = ''
stack = []
for i in w:
if i in '+-*/()':
if i in '+-':
if i == '+':
while stack and stack[-1] in '-*/':
result += stack.pop()
stack.append(i)
else:
while stack and stack[-1] in '+*/':
result += stack.pop()
stack.append(i)
elif i in '*/':
if i == '*':
while stack and stack[-1] in '*':
result += stack.pop()
stack.append(i)
else:
while stack and stack[-1] in '/':
result += stack.pop()
stack.append(i)
elif i == '(':
stack.append(i)
elif i == ')':
while stack[-1] != '(':
result += stack.pop()
stack.pop()
else:
result += i
while stack:
result += stack.pop()
print(result)
비슷하게 수정하면서 여러번 제출 했는데 세 번이나 틀렸다.
최종 정답
import sys
w = sys.stdin.readline().strip()
result = ''
stack = []
for i in w:
if i in '+-*/()':
if i == '(': # 우선순위 최우선 무조건 삽입
stack.append(i)
elif i == ')': # 여는 괄호가 나올때까지 스택의 모든 요소 빼냄
while stack and stack[-1] != '(':
result += stack.pop()
stack.pop()
elif i in '+-': # 우선순위 최하위, 앞에 있는 사칙 연산 모두 빼냄
while stack and stack[-1] in '+-*/':
result += stack.pop()
stack.append(i)
elif i in '*/': # 우선 순위 중간, 앞에있는 */ 빼냄
while stack and stack[-1] in '*/':
result += stack.pop()
stack.append(i)
else:
result += i
while stack: # 남아있는 요소는 모두 꺼냄
result += stack.pop()
print(result)
화가 나서 싹 지우고 조건을 생각한 다음에 다시 짜고 제출했더니 맞았다.
느낀점
문제 자체는 어렵지 않은 문제인데, 쉬워보여서 그런지 일단 코드를 쳤다가 여러번 틀렸다.
조건 꼼꼼히 생각하고 하나씩 풀어야지.
SWEA에서 비슷한 문제를 풀었어서 쉽게 느껴졌다. 세 번 틀리고 할 말은 아니지만
'알고리즘 > 🥇 골드' 카테고리의 다른 글
백준 2206 벽 부수고 이동하기 파이썬 풀이 (1) | 2023.05.13 |
---|---|
백준 1600 말이 되고픈 원숭이 파이썬 풀이 (0) | 2023.05.12 |
백준 1238 파티 파이썬 풀이, 반례 (0) | 2023.05.10 |
백준 12851 숨바꼭질2 파이썬 풀이, 반례 (0) | 2023.05.09 |
백준 3665 최종순위 파이썬 풀이 (0) | 2023.05.08 |