본문 바로가기
WIL

10/23 WIL

by 달리는 꿈나무 2022. 10. 23.

1.  알고리즘 관련 공부

이번 주는 공부했던 알고리즘 지식을 정리하려 한다.

 

스택

  • 선입후출 방식
  • 후위 표기식, 가장 큰 수 등 이전에 사용한 데이터를 이용하여 해결할 때 가장 사용을 많이 하는 자료구조다.
  • 연산자와 숫자 구분, 스트링 객체들을 차례로 저장하는 문제 등에 구분하거나 전 데이터를 이용한다.
  • 파이썬의 경우 스택 또는 큐는 리스트의 인덱싱[-1] 과 pop(), popleft() 등을 통해 구현이 가능해서 리스트를 쓴다.

예제) 후위표기식 만들기(스택)

 

 중위표기식이 입력되면 후위표기식으로 변환하는 프로그램을 작성하세요.
중위표기식은 우리가 흔히 쓰은 표현식입니다. 즉 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-

 

구현(파이썬)

fomula = input()

stack = []

# 파이썬은 스트링을 더할 수 있다.
res = ''

# 더하기와 뺴기는 스택에 넣어두고 숫자는 그대로 출력
# 곱하기와 나누기를 만났으면 스택에서 곱하기와 나누기만 꺼내야한다.
# 없으면 곱하기 혹은 나누기를 넣는다.
# 여는 괄호가 나왔으면 일단 스택에 넣고
# 닿는 괄호가 나올 때 여는 괄호 전의 연산자들을 우선순위를 통해 pop()한다.
# 즉 여는 괄호 뒤에 연산자를 만나면 여는 괄호 뒤에 들어간 연산자를 연산처리한다.
# 여는 괄호 뒤에 연산자가 없으면 그냥 현재를 넣는다.
# 우선순위가 높은 연산자를 스택의 상단에 위치시키는게 핵심이다.

# 기본적으로 연산자면 자기 순서도 append 한다는 것을 잊지 말자

for x in fomula:
    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)

 

'WIL' 카테고리의 다른 글

11/06 WIL  (0) 2022.11.06
10/30 WIL  (1) 2022.10.30
10/16 WIL  (0) 2022.10.23
10/09 WIL  (0) 2022.10.09
10/02 WIL  (0) 2022.10.02