์ž๋ฃŒ๊ตฌ์กฐ ๋ฐ ์‹ค์Šต

์ž๋ฃŒ๊ตฌ์กฐ ๋ฐ ์‹ค์Šต - [6] ์Šคํƒ ์‹ค์Šต๋ฌธ์ œ (ํŒŒ์ด์ฌ์œผ๋กœ ์‹ฌ๋ณผ๊ท ํ˜•, ํ›„์œ„์ˆ˜์‹ ๊ตฌํ˜„ํ•˜๊ธฐ) (2)

Mainyoung 2022. 1. 27. 23:15

์‹ฌ๋ณผ๊ท ํ˜•

 

์Šคํƒ ADT๋ฅผ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•˜์—ฌ ์‹ฌ๋ณผ๋“ค์˜ ๊ท ํ˜•์„ ๊ฒ€์‚ฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ผ

์‹ฌ๋ณผ ๊ท ํ˜•์ด๋ž€ (),[] ๋“ฑ๊ณผ ๊ฐ™์ด ๊ด„ํ˜ธ์˜ ์ง์ด ๋งž๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค. ์ž…๋ ฅ ์˜ˆ์‹œ์™€ ์ถœ๋ ฅ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž.

>>> (3+40*(2+(30-7)*2133)
Wrong_5 # ์‹ฌ๋ณผ ๊ท ํ˜•์ด ์ด๋ฃจ์–ด ์ง€์ง€ ์•Š์•˜์œผ๋ฉฐ, ๋ฌธ์žฅ์•ˆ์˜ ๊ด„ํ˜ธ์˜ ๊ฐœ์ˆ˜๊ฐ€ 5๊ฐœ์ด๋‹ค.

>>> 3*{4+(2-792)/1} + [3*{4-2* (100 -7)}]
OK_10 # ์‹ฌ๋ณผ ๊ท ํ˜•์ด ์ด๋ฃจ์–ด ์กŒ์œผ๋ฉฐ, ๋ฌธ์žฅ์•ˆ์˜ ๊ด„ํ˜ธ์˜ ๊ฐœ์ˆ˜๊ฐ€ 10๊ฐœ์ด๋‹ค.

>>> 301*{4+(2101-7)/1} + 9*{4-2* (10108-7)}}
Wrong_9 # ์‹ฌ๋ณผ ๊ท ํ˜•์ด ์ด๋ฃจ์–ด ์ง€์ง€ ์•Š์•˜์œผ๋ฉฐ, ๋ฌธ์žฅ์•ˆ์˜ ๊ด„ํ˜ธ์˜ ๊ฐœ์ˆ˜๊ฐ€ 9๊ฐœ์ด๋‹ค.

>>> (3*{4001+(2-7)/1} + [3*{4-2* (1-7)}])
OK_12 # ์‹ฌ๋ณผ ๊ท ํ˜•์ด ์ด๋ฃจ์–ด ์กŒ์œผ๋ฉฐ, ๋ฌธ์žฅ์•ˆ์˜ ๊ด„ํ˜ธ์˜ ๊ฐœ์ˆ˜๊ฐ€ 12๊ฐœ์ด๋‹ค.

 

๋‹จ์ˆœํžˆ ์‹ฌ๋ณผ๊ท ํ˜•๋งŒ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ด„ํ˜ธ์˜ ์ด ๊ฐฏ์ˆ˜๊นŒ์ง€ ์ถœ๋ ฅํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๊ด„ํ˜ธ ๊ฐฏ์ˆ˜๊ฐ€ ํ™€์ˆ˜์ธ๊ฒƒ์œผ๋กœ๋„ ์‹ฌ๋ณผ๊ท ํ˜•์„ ํ™•์ธํ•  ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค. ํ•˜์ง€๋งŒ ์ง์ˆ˜๋ผ๊ณ  ๋ชจ๋“  ์‹ฌ๋ณผ๊ท ํ˜•์ด ๋งž๋Š”๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

 

 

๋จผ์ € ํŒŒ์ด์ฌ์˜ Class๋ฅผ ํ™œ์šฉํ•ด ๋‹จ์ผ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ์ŠคํƒADT๋ฅผ ๊ตฌํ˜„ํ•˜์ž.

#๋‹จ์ผ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์— ๊ธฐ์ดˆํ•œ ์Šคํƒ
class Node:
  def __init__(self,data,next=None):
    self.data = data
    self.next = next

class stack:
  def __init__(self,N):
    self.top = None
    self.full = N
    self.stacksize=0

  def push(self,data):
    newnode = Node(data,self.top)
    self.top = newnode
    self.stacksize +=1

  def isEmpty(self):
    if self.top == None:
      return True
    else:
      return False
  
  def pop(self):
    if self.isEmpty():
      print("Stack Empty")
    elem = self.top.data
    p = self.top
    self.top = self.top.next
    del(p)
    self.stacksize -=1
    # print("pop :",elem) #popํ•œ ์›์†Œ๋ฅผ ์ถœ๋ ฅ
    return elem
  
  def printstack(self):
    target = self.top
    if self.isEmpty():
      print("None")
    else:
      while (target.next != None):
        print(target.data,end = ",")
        target = target.next
      print(target.data)
  
  def peek(self):
    if self.top == None:
      print("Stack Empty")
    else:
      print(self.top.data)
  
  def duplicate(self):
    new = self.pop()
    if self.stacksize ==self.full:
      print("Stack Full")
    else:
      self.push(new)
    if self.stacksize ==self.full:
      print("Stack Full")
    else:
     self.push(new)

์ด๋ฒˆ์—๋Š” ๊ด„ํ˜ธ์˜ ์ง์„ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•ด๋ณด์ž.

์‹ฌ๋ณผ๊ท ํ˜•์˜ ์˜์‚ฌ์ฝ”๋“œ

์˜์‚ฌ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ฝ”๋“œ ์ง„ํ–‰๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1. ๋นˆ ์Šคํƒ์„ ํ•˜๋‚˜ ์ƒ์„ฑํ•œ๋‹ค.
2. ์ž…๋ ฅ์„ ๋๊นŒ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฆฐ๋‹ค.
3. ์ฒซ๋ฒˆ์งธ ์ž…๋ ฅ์„ ํ™•์ธํ•œ๋‹ค.
4. ๋งŒ์•ฝ ์—ด๋ฆฐ ๊ด„ํ˜ธ๋ชจ์–‘ ("(", "{", "[") ์ด๋ฉด ์ƒ์„ฑํ–ˆ๋˜ ์Šคํƒ์— pushํ•œ๋‹ค.
5. ๋งŒ์•ฝ ๋‹ซํžŒ ๊ด„ํ˜ธ๋ชจ์–‘ (")", "}", "]") ์ธ๋ฐ, 
5-1. ๋งŒ์•ฝ ์Šคํƒ์ด ๋น„์–ด์žˆ๋‹ค๋ฉด -> ์‹ฌ๋ณผ ๊ท ํ˜•์ด ๋งž์ง€ ์•Š์œผ๋ฏ€๋กœ False๋ฅผ returnํ•œ๋‹ค.
5-2. ๋ณ€์ˆ˜ top์— ์Šคํƒ์˜ ์›์†Œ๋ฅผ popํ•œ ํ›„, ์‹ฌ๋ณผ์˜ ์ง์ด ๋งž๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
5-3. ์ง์ด ๋งž์ง€ ์•Š์œผ๋ฉด False๋ฅผ return ํ•œ๋‹ค.
6. ์ตœ์ข…์ ์œผ๋กœ ์Šคํƒ์ด ๋น„์–ด์žˆ์œผ๋ฉด True, ์Šคํƒ์— ์›์†Œ๊ฐ€ ๋‚จ์•„์žˆ์œผ๋ฉด False๋ฅผ returnํ•œ๋‹ค.

 

์ด๋ฅผ ๊ทธ๋Œ€๋กœ ํŒŒ์ด์ฌ์œผ๋กœ ๊ตฌํ˜„ํ•ด๋ณด์ž.

def symbol_check(string):
  st = stack(1000)
  open_symbol = ["(","{","["] #์—ด๋ฆฐ ๊ด„ํ˜ธ ๋ชจ์Œ์„ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ
  close_symbol = [")","}","]"] # ๋‹ซํžŒ ๊ด„ํ˜ธ ๋ชจ์Œ์„ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ
  cnt=0 # ๊ด„ํ˜ธ ๊ฐฏ์ˆ˜ ์นด์šดํŠธ
  F=0 # ์ค‘๊ฐ„์— ์‹ฌ๋ณผ๊ท ํ˜•์ด ๋งž์ง€ ์•Š์•˜์„ ๋•Œ F์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜์—ฌ F๊ฐ€ 0 ์ดˆ๊ณผ๋ฉด Wrong ์ถœ๋ ฅ
  for i in range(len(string)):
    s = string[i]
    if s in open_symbol:
      st.push(s)
      cnt+=1
    elif s in close_symbol:
      cnt+=1
      if st.isEmpty():
        F+=1
      else:
        t = st.pop()
        if not ((s==close_symbol[0] and t ==open_symbol[0]) or (s==close_symbol[1] and t ==open_symbol[1]) or (s==close_symbol[2] and t ==open_symbol[2]) ):
          F+=1
  if not st.isEmpty():
    return print(f"Wrong_{cnt}")
  elif F>0:
    return print(f"Wrong_{cnt}")
  else:
    return print(f"OK_{cnt}")

์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉฐ ๋Œ์•„๊ฐ€๋Š” ์ˆœ์„œ๋ฅผ ์ž˜ ์ƒ๊ฐํ•˜์—ฌ ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ํ•˜์ž!  ๋งจ ์ฒ˜์Œ์— ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ ๋˜๋ฉด์„œ... ์•ˆ๋˜๋ฉด์„œ... ํ•˜๊ธธ๋ž˜ ๊ณ„์†ํ•ด์„œ ๊ณผ์ •์„ ์ถœ๋ ฅํ–ˆ๋Š”๋ฐ, ๊ฒฐ๊ตญ์€ ์กฐ๊ฑด์— ๋งž๊ฒŒ ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ์ž˜๋ชปํ•ด์„œ ๊ทธ๋Ÿฐ ๊ฒƒ์ด์—ˆ๋‹ค. ํ˜„์žฌ๋Š” ์ž˜ ์‹คํ–‰๋œ๋‹ค.

 


ํ›„์œ„์ˆ˜์‹

ํ›„์œ„์ˆ˜์‹ ๋ฌธ์ œ๋Š” ์Šคํƒ์„ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ๊ผญ ๋‚˜์˜ค๋Š” ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ํ›„์œ„์ˆ˜์‹์ด๋ž€ ์—ฐ์‚ฐ ํ‘œ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ, ์šฐ๋ฆฌ๋Š” ํ”ํžˆ '์ค‘์œ„์ˆ˜์‹'์„ ์‚ฌ์šฉํ•˜์—ฌ 'ํ›„์œ„์ˆ˜์‹' ํ‘œ๊ธฐ๋ฒ•์„ ๋ณด๋ฉด ๋‹ค์†Œ ์ด์ƒํ•˜๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ๋‹ค. ํ›„์œ„์ˆ˜์‹์˜ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

#1 
์ค‘์œ„ ์ˆ˜์‹ : 5*3+2+(6+3)*2
ํ›„์œ„ ์ˆ˜์‹ : 53*2+63+2*+

#2
์ค‘์œ„ ์ˆ˜์‹ : 2+3*4
ํ›„์œ„ ์ˆ˜์‹ : 234*+

#3
์ค‘์œ„ ์ˆ˜์‹ : 7/2-3+4*2-2*1
ํ›„์œ„ ์ˆ˜์‹ : 72/3-42*+21*-

#4
์ค‘์œ„ ์ˆ˜์‹ : 9+(2*3+1)*2
ํ›„์œ„ ์ˆ˜์‹ : 923*1+2*+

 

ํ›„์œ„์ˆ˜์‹์—๋Š” ๋‘๊ฐ€์ง€ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค.

convert() : ์ค‘์œ„ ์ˆ˜์‹์„ ํ›„์œ„์ˆ˜์‹์œผ๋กœ ์ „ํ™˜

evaluate() : ํ›„์œ„ ์ˆ˜์‹์„ ํ‰๊ฐ€

 

convert ๋ฉ”์„œ๋“œ์˜ ์˜์‚ฌ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.

convert ๋ฉ”์„œ๋“œ์˜ ์˜์‚ฌ์ฝ”๋“œ

์˜์‚ฌ์ฝ”๋“œ์— ์˜ํ•œ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1. ๋จผ์ € ์—ฐ์‚ฐ์ž์˜ ์šฐ์„ ์ˆœ์œ„์ •๋ณด๊ฐ€ ๋‹ด๊ธด P๋ฅผ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค. 
2. ๋นˆ ์Šคํƒ์„ ํ•˜๋‚˜ ์ƒ์„ฑํ•œ๋‹ค.
3. ์ˆ˜์‹์„ ํ•˜๋‚˜ํ•˜๋‚˜ ํ™•์ธํ•˜๋Š” ๋ฐ˜๋ณต๋ฌธ์„ ๋ˆ๋‹ค.
4-1. ๋งŒ์•ฝ ํ˜„์žฌ ํ•ด๋‹นํ•˜๋Š” ์ˆ˜์‹์ด ์ˆซ์ž์ด๋ฉด ์ถœ๋ ฅํ•œ๋‹ค.
4-2. ๋งŒ์•ฝ "("๋ฉด ์Šคํƒ์— pushํ•œ๋‹ค.
4-3. ๋งŒ์•ฝ ")"์ผ๋•Œ ์Šคํƒ์˜ top์ด "("์ด ์•„๋‹๋•Œ๊นŒ์ง€ popํ•˜๋ฉด์„œ ์ถœ๋ ฅ ํ•˜๊ณ  ๋ฐ˜๋ณต๋ฌธ ํƒˆ์ถœํ›„ pop์„ ํ•œ๋ฒˆ ๋”ํ•œ๋‹ค.
4-4. ๋งŒ์•ฝ ์—ฐ์‚ฐ์ž๋ฉด ์Šคํƒ์ด ๋น„์–ด์žˆ์ง€ ์•Š์œผ๋ฉด์„œ ์Šคํƒ์˜ top์— ์žˆ๋Š” ์—ฐ์‚ฐ์ž์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ํ˜„์žฌ ์—ฐ์‚ฐ์ž์˜ ์šฐ์„ ์ˆœ์œ„๋ณด๋‹ค ๋†’์€ ๊ฒฝ์šฐ ๋ฐ˜๋ณต๋ฌธ์„ ๊ณ„์† ๋Œ๋ฉด์„œ popํ•˜๋ฉด์„œ ์ถœ๋ ฅํ•œ๋‹ค. ์ดํ›„ ๋ฐ˜๋ณต๋ฌธ ํƒˆ์ถœํ•˜๋ฉด ํ˜„์žฌ ์—ฐ์‚ฐ์ž๋ฅผ pushํ•œ๋‹ค.
5. ์Šคํƒ์ด ๋นŒ๋•Œ๊นŒ์ง€ popํ•˜๋ฉด์„œ ์ถœ๋ ฅํ•œ๋‹ค.

 

์‚ฌ์‹ค Python์˜ ๋ฆฌ์ŠคํŠธ์—์„œ pop๊ณผ append๋กœ ์Šคํƒ์„ ํ‰๋‚ด๋‚ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฒˆ์—๋Š” ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ–ˆ๋‹ค.

def convert(string):
  p = {"(":0,"+":1,"-":1,"*":2,"/":2}
  num = ["0","1","2","3","4","5","6","7","8","9"]
  stack = []
  lastcnt =0
  kkk=''
  while lastcnt != len(string):
    s = string[lastcnt]
    if s in num:
      print(s,end="")
      kkk=kkk+s
    elif s == '(':
      stack.append(s)
    elif s== ')':
      while stack[-1] != '(':
        print(stack.pop(),end="")
        kkk=kkk+s
      stack.pop()
    else:
      while len(stack)!=0 and (p[s]<=p[stack[-1]]):
        print(stack.pop(),end ="")
        kkk=kkk+s
      stack.append(s)

    lastcnt+=1
  while len(stack)!=0:
    print(stack.pop(),end = "")
    kkk=kkk+s
  return kkk

 

evaluate ๋ฉ”์„œ๋“œ์˜ ์˜์‚ฌ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.

evaluate ๋ฉ”์„œ๋“œ์˜ ์˜์‚ฌ์ฝ”๋“œ

์˜์‚ฌ์ฝ”๋“œ์— ์˜ํ•œ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1. ๋นˆ์Šคํƒ ์ƒ์„ฑํ•œ๋‹ค.
2. ์ˆ˜์‹์„ ๋๊นŒ์ง€ ๋„๋Š” ๋ฐ˜๋ณต๋ฌธ ์‹คํ–‰ํ•œ๋‹ค.
3. ๋งŒ์•ฝ ์ˆซ์ž๋ฉด ์Šคํƒ์— pushํ•œ๋‹ค.
4. ๋งŒ์•ฝ ์—ฐ์‚ฐ์ž๋ผ๋ฉด a์™€b์— popํ•ด์„œ ์ €์žฅ ํ›„ ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ์Šคํƒ์— pushํ•œ๋‹ค.
5. ๋ฐ˜๋ณต๋ฌธ ํƒˆ์ถœ ํ›„ ์Šคํƒ์— ์žˆ๋Š” ์›์†Œ๋ฅผ popํ•œ๋‹ค
def doOperator(op,x,y):
  if op =='+':
    v = int(x)+int(y)
  elif op == '-':
    v = int(x)-int(y)
  elif op == '*':
    v = int(x)*int(y)
  elif op == '/':
    v = int(x)/int(y)
  return v

def evaluate(string):
  stack = []
  num = ["0","1","2","3","4","5","6","7","8","9"]
  for i in range(len(string)):
    s = string[i]
    if s in num:
      stack.append(s)
    else:
      a = stack.pop()
      b = stack.pop()
      stack.append(doOperator(s,b,a))
  print(stack.pop())
728x90