본문 바로가기

알고리즘/백준 문제 풀이

[Python] 23629번 이 얼마나 끔찍하고 무시무시한 수식이니

728x90

https://www.acmicpc.net/problem/23629

 

23629번: 이 얼마나 끔찍하고 무시무시한 수식이니

영문 대문자 및 +,-,x,/,=로 이루어진 문자열이 주어진다. 문자열은 =로 끝나며, 연산자로 시작하지 않는다. =은 항상 문자열의 마지막에만 등장한다. 문자열의 시작 또는 연산자의 바로 다음에 "Z

www.acmicpc.net


 

22/09/24

 

 

문제에서 요구하는 바를 차근차근 따라가면 쉽게 구현할 수 있는 문제로, 나눗셈의 구현만 조심해서 구현하면 된다.


 

문제 접근 방식:

 

 

문제에서 첫 번째로 요구하는 것은 문자열로 주어진 수식을 숫자로 바꾸는 것이다.

 

나는 이를 구현하기 위해 파이썬의 replace메서드를 활용하여 문자열을 입력받으면 이를 모두 숫자로 바꿔주었다.

 

그리고 수식은 연산자를 기준으로 분리가 되므로, 연산자를 모두 같은 문자로 치환 후에 그 문자를 기준으로 split을 해주었다.

 

이 과정을 통해 만들어진 리스트는 숫자로 된 문자열이 담겨 있는 리스트이다.

 

수식이 만들어지지 않는 경우는 연산자 두개가 동시에 붙어있을 때인데, 이때 split함수를 사용하면 빈 문자열이 나오므로, 이를 활용하여 예외처리를 진행함으로써 Madness! 를 출력하도록 해주었다.

 

또한, 숫자 문자열이 담겨져 있는 리스트와 연산자만 담겨 있는 리스트를 따로따로 만들어서 순서대로 연산을 진행했다.

 

이때, 당연히 나눗셈을 구현할 때 0과 가까운 쪽으로 나눗셈을 진행한다고 했으므로 나눗셈을 한 결과가 음수면 ceil함수를, 양수면 floor함수를 사용하여 구현하였다.

 

이후 최종적으로 나온 숫자를 문자열로 바꾸고, 이를 다시 replace메서드를 활용하여 영어로 된 문자열로 출력하게 만들었다.


아래는 내가 위의 접근 방식과 같이 작성한 파이썬 코드이다. 더보기를 누르면 확인할 수 있다.

더보기
# 23629번 이 얼마나 끔찍하고 무시무시한 수식이니
# 문자열
from math import *
replace_list = ['ZERO', 'ONE', 'TWO', 'THREE', 'FOUR',
                'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE']
op_list = ['+', '-', 'x', '/']
op_stack = []

S = input()
for i in range(10):
    S = S.replace(replace_list[i], str(i))

k = S
for op in op_list:
    k = k.replace(op, ',')

for char in S:
    if char in op_list:
        op_stack.append(char)

try:
    num_li = list(map(int, k.rstrip('=').split(',')))
    total_value = num_li[0]
    for i in range(len(op_stack)):
        if op_stack[i] == '+':
            total_value += num_li[i+1]
        elif op_stack[i] == '-':
            total_value -= num_li[i+1]
        elif op_stack[i] == 'x':
            total_value *= num_li[i+1]
        else:
            total_value /= num_li[i+1]
            if total_value < 0:
                total_value = ceil(total_value)
            else:
                total_value = floor(total_value)
    total_value = str(total_value)
    for num in total_value:
        if num in op_list:
            continue
        total_value = total_value.replace(num, replace_list[int(num)])
    print(S)
    print(total_value)
except ValueError:
    print('Madness!')