์๋ฃ๊ตฌ์กฐ ๋ฐ ์ค์ต - [6] ์คํ ์ค์ต๋ฌธ์ (ํ์ด์ฌ์ผ๋ก ์ฌ๋ณผ๊ท ํ, ํ์์์ ๊ตฌํํ๊ธฐ) (2)
์ฌ๋ณผ๊ท ํ
์คํ 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 ๋ฉ์๋์ ์์ฌ์ฝ๋๋ฅผ ์ดํด๋ณด์.
์์ฌ์ฝ๋์ ์ํ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
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 ๋ฉ์๋์ ์์ฌ์ฝ๋๋ฅผ ์ดํด๋ณด์.
์์ฌ์ฝ๋์ ์ํ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
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())