• 분류 전체보기 (512)
    • 개발남노씨(Coding Test) (6)
    • 고농축 백엔드 (17)
    • 재귀함수 DFS 총정리 (1)
    • 프론트엔드 날개달기:Vuejs.React (1)
    • 훈훈한 javascript (5)
    • 렛츠기릿 자바스크립트 (18)
    • 나도코딩 (1)
      • 웹 스크래핑 (1)
    • 프로그래머스(자바스크립트) (41)
      • LV.0(자바스크립트) (41)
    • 프로그래머스(자바) (121)
      • LV.0(자바) (56)
      • LV.1(자바) (41)
      • LV.2(자바) (23)
    • 프로그래머스(파이썬) (127)
      • LV.0(파이썬) (46)
      • LV.1(파이썬) (51)
      • LV.2(파이썬) (30)
    • 임시저장소 (31)
    • 프로젝트 (0)
    • 자바 알고리즘 (13)
      • 알고리즘 직빵 자바 문법 (10)
      • String(문자열) (3)
    • 파이썬 알고리즘 (93)
      • 알고리즘 직빵 파이썬 문법 (20)
      • 알고리즘 백준 (2)
      • 파이썬 알고리즘(사고력기르기) (6)
      • 파이썬 탐색 & 시물레이션 (8)
      • 이분탐색 & 그리디 알고리즘 (10)
      • 스택, 큐, 해쉬, 힙 (10)
      • 완전탐색과 DFS기초 (12)
      • DFS, BFS 활용 (19)
      • 동적계획법 (6)
    • 자바 (27)
      • Java TPC(생각하고, 표현하고, 코딩하고) (17)
      • Java (중요하고, 이해 안 되고, 어려운) (10)
    • 스프링 (5)
      • 스프링 MVC 패턴 2편 (5)
hELLO · Designed By 정상우.
@@#@@

기록용 블로그

파이썬 알고리즘/스택, 큐, 해쉬, 힙

3. 후위 표기식 만들기

2022. 11. 5. 16:18

후위표기식 만들기

중위표기식이 입력되면 후위표기식으로 변환하는 프로그램을 작성하세요.
중위표기식은 우리가 흔히 쓰은 표현식입니다. 즉 3+5 와 같이 연산자가 피연산자 사이에 있
으면 중위표기식입니다.
후위표기식은 35+ 와 같이 연산자가 피연산자 뒤에 있는 표기식입니다.
예를 들어 중위표기식이 3+5*2 를 후위표기식으로 표현하면 352*+ 로 표현됩니다.
만약 다음과 같이 연산 최우선인 괄호가 표현된 식이라면
(3+5)*2 이면 35+2* 로 바꾸어야 합니다.
.


▣ 입력설명
첫 줄에 중위표기식이 주어진다. 길이는 100을 넘지 않는다.
식은 1~9의 숫자와 +, -, *, /, (, ) 연산자로만 이루어진다.


▣ 출력설명
후위표기식을 출력한다.


▣ 입력예제 1
3+5*2/(7-2)


▣ 출력예제 1
352*72-/+


▣ 입력예제 2
3*(5+2)-9


▣ 출력예제 2
352+*9-

 

 

1. 문제풀이 

import sys
sys.stdin=open("input.txt", "r")
a=input()
stack=[]
res=''
for x in a:
    if x.isdecimal():
        res+=x
    else:
        if x=='(':
            stack.append(x)
        elif x=='*' or x=='/':
            while stack and (stack[-1]=='*' or stack[-1]=='/'):
                res+=stack.pop()
            stack.append(x)
        elif x=='+' or x=='-':
            while stack and stack[-1]!='(':
                res+=stack.pop()
            stack.append(x)
        elif x==')':
            while stack and stack[-1]!='(':
                res+=stack.pop()
            stack.pop()
while stack:
    res+=stack.pop()
print(res)

 

2. 해설 

 

1.  elif x=='*' or x=='/':
            while stack and (stack[-1]=='*' or stack[-1]=='/'):

   

   →동일순위 연산자임에도 스택에 동일순위 연산자가 먼저 들어가서 우선순위가 높은 경우 

 

 

 

2. elif x=='+' or x=='-':
            while stack and stack[-1]!='(':

 

   → "+" 나 " - " 이전에 스택에  

       동순위연산자 "+" 또는 " - " ,  우선순위 연산자 " * " 또는 " / "가 먼저 있는 경우
      " ( " 여는 괄호를 만나기 전까지 계속 pop한다. 

 

3.  elif x==')':
            while stack and stack[-1]!='(':
                res+=stack.pop()
            stack.pop()     ←--------------------" ( " 여는 괄호까지 pop한다.

      

 

4. while stack:                  스택에 남아있는 연산자가 있는 경우 
       res+=stack.pop()      연산자를 전부 pop한다.

 

 

3. 보충해설

 ▶ + 와   - 가 동일한 우선순위를 갖는다고 할지라도 스택에 들어 있는 + 또는 - 를 먼저 pop 한다.

     *  와   /  가 동일한 우선순위를 갖는다고 할지라도 스택에 들어 있는 * 또는 - 를 먼저 pop 한다.

 

▶ 여는 괄호 " ( "는 무조건 stack에 append 한다.

 

▶ 여는 괄호 " (  "를 넣은 다음에 + 또는 * 가 스택에 들어가고, 그 다음에  " - "가 오는 경우에는 

     + 와  * 가  " - "  보다 우선 순위가 높으므로    "( " 여는 괄호 전까지   + 와  *  를 모두   pop시킨다.

저작자표시 비영리 변경금지 (새창열림)

'파이썬 알고리즘 > 스택, 큐, 해쉬, 힙' 카테고리의 다른 글

6. 응급실  (0) 2022.11.05
5. 공주 구하기(큐)  (0) 2022.11.05
4. 후위식 연산  (0) 2022.11.05
2. 쇠 막대기  (0) 2022.11.05
1. 가장 큰 수(스택)  (0) 2022.11.05
    '파이썬 알고리즘/스택, 큐, 해쉬, 힙' 카테고리의 다른 글
    • 5. 공주 구하기(큐)
    • 4. 후위식 연산
    • 2. 쇠 막대기
    • 1. 가장 큰 수(스택)
    @@#@@
    @@#@@
    자바, 스프링, 알고리즘, 깃허브, 파이썬

    티스토리툴바