문제
풀이
해당 문제는 스택을 이용한 연산을 진행하는 문제이다.
문제 자체를 구현하는데는 시간이 많이 걸리지는 않았으나, 예외 처리 과정에서 디버깅 시간이 많이 걸린 문제였다.
식 자체가 틀린 경우 0을 출력해야 하기 때문에, 리턴을 이용하여 한번에 끝낼 수 있도록 함수를 만들어서 사용하였고, 다양한 조건식을 이용해야 했다.
코드 흐름을 간단히 해설해 보면, 우선 식을 입력받은 뒤, for문을 이용하여 차례대로 탐색을 진행한다.
이 과정에서, try-except 문을 통째로 넣어서, 스택의 크기가 0인데 pop하는 상황이 발생하면 에러가 발생하기 때문에, 해당 에러가 발생할 시 식에 오류가 있다고 판단하고, 바로 0을 리턴할 수 있도록 했다.
이후 정상적인 식일 경우 조건문을 살펴보자.
우선 스택에 아무 값이 없는데 ) 또는 ]가 입력되었을 경우 비정상 식이라고 판단한다.
그리고 비정상 식이 아닌 경우, [나 (가 입력되면 우선 스택에 넣어 둔다.
그리고 이렇게 스택에 쭉 넣어가다가, ]나 )가 입력되는 경우를 확인해 보자.
]나 )가 입력되면, 그 순간부터 스택의 값들을 pop해나가면서 그에 대응되는 반대쪽 괄호가 나올때까지 연산을 진행해 주면 된다.
예를 들어 생각하면, ([]) 라는 식이 있을 때, 해당 식을 (3)으로 만들고, 해당 식을 다시 6으로 만드는 과정인 것이다.
이때 스택에서의 상황을 보면, "(, ["가 들어있다가, ]를 만나면서 [가 pop되고, []이 3으로 변환되어 다시 스택에 들어가면, "(, 3"이 된다.
이러한 형태로 반복 연산을 진행하고, 이때 괄호가 ]를 만나면서 pop을 진행하면 다음 [를 만나기 전까지 스택 내부에는 숫자만 존재해야 하기 때문에 int 형태의 값이 아닌 경우 잘못된 식으로 판단했다.
이런 상황에서 [이후에 바로]을 만나거나, (이후 바로 )를 만나는 경우의 예외처리를 위해 loop_flag라는 값을 이용하여 해당 경우에는 기존 값들을 더하는 것이 아니라, 3또는 2가 바로 스택에 들어갈 수 있도록 처리해 주었다.
이후 마지막에 연산이 모두 끝난 후, 스택의 값들을 확인하여 모두 숫자일 경우 더하고, 숫자가 아닌 값이 하나라도 존재할 경우 식에 오류가 존재한다고 판단하였다.
코드
exp = input()
def cal(expression):
stack = []
loop_flag = False
for i in expression:
try:
if len(stack) == 0 and i in "])":
return 0
if i in "[(":
stack.append(i)
elif i == "]":
tmp = stack.pop(-1)
tmp_num = 0
while tmp != "[":
loop_flag = True
if type(tmp) == int:
tmp_num += tmp
else:
return 0
tmp = stack.pop(-1)
if not loop_flag:
tmp_num = 1
loop_flag = False
tmp_num *= 3
stack.append(tmp_num)
else:
tmp = stack.pop(-1)
tmp_num = 0
while tmp != "(":
loop_flag = True
if type(tmp) == int:
tmp_num += tmp
else:
return 0
tmp = stack.pop(-1)
if not loop_flag:
tmp_num = 1
loop_flag = False
tmp_num *= 2
stack.append(tmp_num)
except:
return 0
val = 0
for i in stack:
if type(i) == int:
val += i
else:
return 0
return val
print(cal(exp))
'Development > Algorithm' 카테고리의 다른 글
[programmers] Greedy - 조이스틱 (0) | 2021.03.24 |
---|---|
[programmers] Greedy - 체육복 (0) | 2021.03.23 |
[boj] 10799 - 쇠막대기 (0) | 2021.03.08 |
[boj] 1935 - 후위 표기식 (0) | 2021.03.08 |
[boj] 1874 - 스택 수열 (0) | 2021.03.08 |